我对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,这在标准主题中运行良好,文本框看起来与我想要的完全一样。但是,如果我切换到“经典主题”(在“性能选项”中关闭所有复选框,在“系统属性” - >“控制面板中的高级系统属性”下),文本框将完全丢失它的样式,并丢失它的边框。
普通文本框看起来不错,并且带有边框。它看起来像这样:
在此屏幕截图中,有两个文本框,LinkedTextBox
是第一个,默认(原始TextBox
)是第二个。
我认为BorderBrush="{TemplateBinding BorderBrush
应该BorderBrush
绑定到模板父BorderBrush
- 这是普通TextBox
,但由于某种原因,这在经典主题中不起作用。
我已将debugConverter放入绑定中,并发现如果打开经典主题,我会在那里收到00FFFFFF
作为实心画笔。如果关闭经典主题,我会收到一个颜色和渐变的适当画笔。
我在WPF中不是那么好,而且样式/模板不是我每天都使用的东西,所以我可能在这里做了些傻事。有什么建议吗?
答案 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
容器,因此在每个主题中看起来总是正确的。