【问题标题】:Change fontweight on button in WPF treeview更改 WPF 树视图中按钮的字体粗细
【发布时间】:2013-09-11 15:23:02
【问题描述】:

我有一个模板化的树视图,可以按我的意愿工作,但我有一个上下文菜单,允许将第 1 层节点标记为“默认”。

我有一个数据触发器,它对视图模型中的一个属性做出反应,它应该将字体粗体更改为粗体,以直观地显示这是默认节点。但是setter无论如何都不会改变按钮上的fontweight!

但是,如果我更改另一个值,例如前景色,它可以正常工作,字体大小也没有问题。

这是为什么,谁能解释一下?如果需要,这里是一些代码:

触发器:

<HierarchicalDataTemplate ItemsSource="{Binding Children,Mode=TwoWay,NotifyOnSourceUpdated=True}">
    <StackPanel Orientation="Horizontal" VerticalAlignment="Top">
        <Image x:Name="nodeImg" Source="{Binding Image}" MaxHeight="16" MaxWidth="16"/>
        <Button x:Name="nodeButton" Content="{Binding Name}" Command="{Binding Command}" Style="{StaticResource TreeMenuButton}"/>
    </StackPanel>

    <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem},Path=IsExpanded}" Value="True">
            <Setter TargetName="nodeImg" Property="Source" Value="{Binding ImageExpanded}"></Setter>
        </DataTrigger>
        <DataTrigger Binding="{Binding IsDefaultConnection}" Value="True">
            <Setter TargetName="nodeButton" Property="FontWeight" Value="Bold"></Setter>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>

按钮的默认样式:

<Style x:Key="TreeMenuButton" TargetType="{x:Type Button}">
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="OverridesDefaultStyle" Value="true" />
    <Setter Property="MinHeight" Value="23" />
    <Setter Property="MinWidth" Value="75" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="Border"
                        CornerRadius="0"
                        BorderThickness="0"
                        Background="Transparent"
                        BorderBrush="Transparent">
                    <ContentPresenter Margin="2"
                                      HorizontalAlignment="Left"
                                      VerticalAlignment="Center"
                                      RecognizesAccessKey="True"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【问题讨论】:

  • 您在按钮中使用的字体是否具有bold 样式,如果是,它在您当前显示的大小上是否在视觉上有所不同?
  • 是的,问题是我在设计器中有不同的数据上下文和模型数据,我实际上可以看到它在设计器中正常工作。我什至可以更改 fontfamily/weight 等,但是一旦我运行它,它就不起作用了

标签: c# wpf mvvm treeview styling


【解决方案1】:

如果您的代码甚至无法将DataTrigger 添加到UIElement.Triggers 集合中,我会感到惊讶。尝试改用Style(这绝对有效):

<Style>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsDefault}" Value="True">
            <Setter Property="TextBlock.FontWeight" Value="Bold" />
        </DataTrigger>
    </Style.Triggers>
</Style>

如果您的DataTemplate 奇迹般地确实UIElement.Triggers 集合中工作,那么请尝试使用类名和属性名:

<Setter Property="TextBlock.FontWeight" Value="Bold" />

【讨论】:

  • 我更新了按钮的样式,所以现在有你的代码,但它仍然不会影响按钮文本 =(。虽然使用你的方式时,FontSize 等仍然可以正常工作。
  • 不,我想将 FontWeight 更改为粗体,但具体更改没有效果,我仍然只能更改 FontSize/ForeColor。还尝试更改按钮的模板,以便代替 ContentPresenter 我有一个带有 x:Name="textBlock" 的 TextBlock,然后在样式触发器中引用带有 TargetName 的 TextBlock。但是结果还是一样,只能更改fontsize/forecolor =(。另一个提示是我为每个按钮设置的样式,我试图通过样式中的 使每个节点默认具有 FontWeight=bold,它甚至不会接受=(。
  • 作为临时测试,将此添加到您的TextBoxFontFamily="Arial"。如果文本现在是粗体,那么您的原始字体不支持字体粗细属性。如果它仍然不粗体,那我就是不知道你的问题是什么。
猜你喜欢
  • 2013-07-24
  • 2015-07-31
  • 2018-05-07
  • 2019-09-21
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
相关资源
最近更新 更多