在WPF中编辑ControlTemplate内元素的属性

u91tlkcl  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(139)

我正在为一些单选按钮构建自定义控件模板。按钮的图像:

在控件模板中,每个单选按钮都将有一个带有名称的文本块,其下还有一个文本块用于指示该按钮是否不可用。我希望“不可用”文本仅在按钮未启用时可见。单选按钮启用时,“不可用”文本块应折叠。
下面是按钮的简化视图.xaml:

<RadioButton Name="one"
                         IsEnabled="{Binding Low_isAvailable}"
                         Style="{StaticResource RadioButtonTheme}" />
            <RadioButton Name="two"
                         IsEnabled="{Binding High_isAvailable}"
                         Style="{StaticResource RadioButtonTheme}" />
            <RadioButton Name="three"
                         IsEnabled="{Binding Nato_isAvailable}"
                         Style="{StaticResource RadioButtonTheme}"/>

下面是我目前拥有的样式的简化版本(RadioButtonTheme.xaml):

<ResourceDictionary>
    <Style BasedOn="{StaticResource {x:Type ToggleButton}}"
           TargetType="{x:Type RadioButton}"
           x:Key="RadioButtonTheme">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border CornerRadius="7">

                        <StackPanel VerticalAlignment="Center">
                            <TextBlock HorizontalAlignment="Center"
                                       Text="{TemplateBinding Property=Name}"
                                       Foreground="{TemplateBinding Property=Foreground}">
                            </TextBlock>
                            <TextBlock Name="UnavailableTextBlock"
                                       HorizontalAlignment="Center"
                                       Text="Unavailable"
                                       FontSize="14"
                                       FontStyle="Italic"
                                       Foreground="{TemplateBinding Property=Foreground}">
                            </TextBlock>
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

所以我试着设置了一些东西:
1.我在view. xaml的单选按钮上设置了一个visiblitity属性。然后我将该可见性绑定到radiobuttontheme.xaml中的“UnavailableTextBlock”,并将模板的其余可见性设置为“Visible”。我以为我可以让模板除了一个元素之外保持可见。现在我认为这是不可能的。
1.我尝试将“UnavailableTextBlock”直接绑定到单选按钮的IsEnabled属性,并通过BoolToVisiblityConverter运行它。

<TextBlock Name="UnavailableTextBlock"
           Visibility="{TemplateBinding Property=IsEnabled, Converter={StaticResource BoolToVisConverter}}">

然而,我似乎无法让我的转换器在ResourceDictionary中工作,程序将崩溃,并显示以下错误:“找不到名为'BoolToVisConverter'的资源。资源名称区分大小写”
自从我把这个转换器添加到我的app. xaml中后,我就可以在其他xaml文件中使用<Application.Resources>它了。我需要把我的资源字典链接到这个转换器吗?我该怎么做?<ResourceDictionary.Resources>似乎对我不起作用。
1.我尝试向“UnavailableTextBlock”添加一个数据触发器,如下所示:

<TextBlock Name="UnavailableTextBlock"....>
   <TextBlock.Style>
      <Style TargetType="TextBlock">
         <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
               <DataTrigger Binding="{TemplateBinding Property=IsEnabled}" Value="false">
                  <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
             </Style.Triggers>
       </Style>
    </TextBlock.Style>
</TextBlock>

但是,我得到一个错误,说:“IsEnabled”成员无效,因为它没有限定的类型名称。“我猜它引用的是TextBlock的IsEnabled属性,而不是单选按钮的IsEnabled属性?虽然我不太确定。我仍在学习WPF。
提前感谢您的帮助!

ia2d9nvy

ia2d9nvy1#

如果我正确理解了您想要实现的内容,那么您需要使用控件模板触发器。

<Style BasedOn="{StaticResource {x:Type ToggleButton}}"
            TargetType="{x:Type RadioButton}"
            x:Key="RadioButtonTheme">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="RadioButton">
                    <Border CornerRadius="7">
                        <StackPanel VerticalAlignment="Center">
                            <TextBlock HorizontalAlignment="Center"
                                    Text="{TemplateBinding Property=Name}"
                                    Foreground="{TemplateBinding Property=Foreground}">
                            </TextBlock>
                            <TextBlock Name="UnavailableTextBlock"
                                    HorizontalAlignment="Center"
                                    Text="Unavailable"
                                    FontSize="14"
                                    FontStyle="Italic"
                                    Foreground="{TemplateBinding Property=Foreground}">
                            </TextBlock>
                        </StackPanel>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="UnavailableTextBlock" Property="Visibility" Value="Hidden"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

相关问题