首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有使用UserControl的BorderThickness FallbackValue和/或TargerNullValue

没有使用UserControl的BorderThickness FallbackValue和/或TargerNullValue
EN

Stack Overflow用户
提问于 2021-03-31 17:33:40
回答 1查看 163关注 0票数 1

我创建了一个UserControl,其中包含一个Button。我将BorderThicknessBorderBrush属性添加到UserControl中,并使用RelativeSource.TemplatedParent映射到内部按钮。

我希望只有在UserControl上指定默认值时才能覆盖它们。此部分目前按预期工作。

代码语言:javascript
复制
<UserControl.Template>
     <ControlTemplate>
          <Button
                BorderThickness="{Binding Path=BorderThickness, RelativeSource={x:Static RelativeSource.TemplatedParent}, FallbackValue=1,TargetNullValue=1}"
                BorderBrush="{Binding Path=BorderBrush, RelativeSource={x:Static RelativeSource.TemplatedParent}, FallbackValue=Black,TargetNullValue=Black}"><Button>
          <!-- ... -->
     </ControlTemplate>
</UserControl.Template>

我可以在我的BorderThickness上指定UserControl,并让它修改内部按钮的BorderThickness,但是默认行为会丢失。所有没有显式设置BorderThicknessBorderBrush的东西现在都没有边框。

我对FallbackValue和TargetNullValue有些熟悉,但正如您在上面看到的,它们都存在。

我不禁觉得这与BorderThickness有点不同的事实有关,因为您可以这样设置它,这就是FallbackValueTargetNullValue的问题所在

代码语言:javascript
复制
BorderThickness="1"
BorderThickness="1 2"
BorderThickness="1 2 3 4"

我也尝试过这样设置:

代码语言:javascript
复制
<Button>
    <Button.BorderThickness>
        <Binding Path="BorderThickness" RelativeSource="{x:Static RelativeSource.TemplatedParent}">
            <Binding.TargetNullValue>
                <Thickness>1</Thickness>
             </Binding.TargetNullValue>
            <Binding.FallbackValue>
                <Thickness>1</Thickness>
            </Binding.FallbackValue>
        </Binding>
    </Button.BorderThickness>
<Button>

我怎样才能达到我想要的行为呢?目前,我可以重写,但默认值不被维护。

EN

回答 1

Stack Overflow用户

发布于 2021-04-01 08:00:13

TargetNullValue for BorderBrush工作,因为它的默认值是null,所以您只是看不到它,因为默认情况下BorderThickness为零。事实上,大多数绑定定义都是多余的。

  • 只有在不能返回值的情况下才使用FallbackValue,这里不是这种情况。您的模板父绑定应该总是成功的,因此您可以删除它。
  • TargetNullValue for BorderThickness是无用的。null.

Thickness是一个struct,而不是struct

如果希望仅为Button的默认值设置自定义默认值,则可以创建带有触发器的样式。TargetNullValue for BorderBrush也可以。

代码语言:javascript
复制
<UserControl.Template>
   <ControlTemplate>
      <ControlTemplate.Resources>
         <Style x:Key="MyButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
            <Setter Property="BorderBrush" Value="{Binding Path=BorderBrush, RelativeSource={x:Static RelativeSource.TemplatedParent}, TargetNullValue=Black}"/>
            <Setter Property="BorderThickness" Value="{Binding Path=BorderThickness, RelativeSource={RelativeSource TemplatedParent}}"/>
            <Style.Triggers>
               <DataTrigger Binding="{Binding Path=BorderThickness, RelativeSource={RelativeSource TemplatedParent}}" Value="0">
                  <Setter Property="BorderThickness" Value="1"/>
               </DataTrigger>
            </Style.Triggers>
         </Style>
      </ControlTemplate.Resources>
      <Button Style="{StaticResource MyButtonStyle}"/>
         <!-- ... -->
   </ControlTemplate>
</UserControl.Template>

注意,我已经将这两个属性提取到一个样式中,以使其在模板中可重用。如果您想在UserControl本身中设置默认值,这就更容易了,因为您不需要触发器。

代码语言:javascript
复制
<UserControl.Style>
   <Style TargetType="{x:Type UserControl}" BasedOn="{StaticResource {x:Type UserControl}}">
      <Setter Property="BorderThickness" Value="1"/>
      <Setter Property="BorderBrush" Value="Black"/>
      <Setter Property="Template">
         <Setter.Value>
            <ControlTemplate>
               <Button BorderThickness="{Binding Path=BorderThickness, RelativeSource={x:Static RelativeSource.TemplatedParent}}"
                       BorderBrush="{Binding Path=BorderBrush, RelativeSource={x:Static RelativeSource.TemplatedParent}}"/>
               <!-- ... -->
            </ControlTemplate>
         </Setter.Value>
      </Setter>
   </Style>
</UserControl.Style>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66892589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档