覆盖具有不同Windows主题的控件模板

时间:2016-07-12 13:53:21

标签: c# wpf

我对TextBox进行了自定义,名为LinkedTextBox,所以我定义了这种风格:

 <Style TargetType="{x:Type controls:LinkedTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="controls:LinkedTextBox">
                <Border BorderThickness="{TemplateBinding BorderThickness}" 
                                         BorderBrush="{TemplateBinding BorderBrush, Converter={StaticResource debugConverter}}" 
                                         Background="{TemplateBinding Background}" >
                    <Grid>
                        <ScrollViewer x:Name="PART_ContentHost" Margin="3"  Background="{TemplateBinding Background}" 
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        <Image x:Name="linkButton" Source="../Resources/link-break-icon.png" Width="16" Height="16"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Right" 
                            Margin="0,0,5,0"/>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsLinked" Value="True">
                        <Setter Value="{StaticResource DisabledBackgroundBrush}" Property="Background" />
                        <Setter Value="{StaticResource DisabledForegroundBrush}" Property="Foreground" />
                        <Setter TargetName="PART_ContentHost" Property="Background" Value="{StaticResource DisabledBackgroundBrush}"/>
                        <Setter TargetName="PART_ContentHost" Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                        <Setter Property="IsReadOnly" Value="True"/>
                        <Setter TargetName="linkButton" Property="Source" Value="../Resources/link-icon.png"/>
                    </Trigger>
                    <Trigger Property="IsLinkingEnabled" Value="False">
                        <Setter TargetName="linkButton" Property="IsEnabled" Value="False"/>
                        <Setter TargetName="linkButton" Property="Visibility" Value="Hidden"/>
                    </Trigger>
                </ControlTemplate.Triggers>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsLinked" Value="True">
            <!--<Setter Property="IsReadOnly" Value="True"/>-->
        </Trigger>
    </Style.Triggers>
</Style>

文本框应该看起来像普通文本框,但有时它可以有一个小图像,单击我执行某些操作并禁用/启用文本框

我正在使用Windows 7,这在标准主题中运行良好,文本框看起来与我想要的完全一样。但是,如果我切换到“经典主题”(在“性能选项”中关闭所有复选框,在“系统属性” - >“控制面板中的高级系统属性”下),文本框将完全丢失它的样式,并丢失它的边框。

普通文本框看起来不错,并且带有边框。它看起来像这样:

enter image description here

在此屏幕截图中,有两个文本框,LinkedTextBox是第一个,默认(原始TextBox)是第二个。

我认为BorderBrush="{TemplateBinding BorderBrush应该BorderBrush绑定到模板父BorderBrush - 这是普通TextBox,但由于某种原因,这在经典主题中不起作用。

我已将debugConverter放入绑定中,并发现如果打开经典主题,我会在那里收到00FFFFFF作为实心画笔。如果关闭经典主题,我会收到一个颜色和渐变的适当画笔。

我在WPF中不是那么好,而且样式/模板不是我每天都使用的东西,所以我可能在这里做了些傻事。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

到目前为止,我有一个修复,但这是非常愚蠢的。无论如何,它是有效的,所以除非任何人有一个建议如何正确和相对简单(我不想为每个主题覆盖手动样式),这可能会工作:

<ControlTemplate TargetType="controls:LinkedTextBox">
                    <Grid>
                        <TextBox x:Name="MyContent" Margin="3" Background="{TemplateBinding Background}" 
                                 Text="{Binding Text, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding IsEnabled, RelativeSource={RelativeSource TemplatedParent}}"/>
                        <Image x:Name="linkButton" Source="../Resources/link-break-icon.png" Width="16" Height="16"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Right" 
                            Margin="0,0,5,0"/>
                    </Grid>
...

简单地说,我已经使用了下一个hack:仅使用普通文本框更改了PART_ContentHost容器,因此在每个主题中看起来总是正确的。