gpt4 book ai didi

wpf - 如何使用 TemplateBinding 继承控件的所有属性

转载 作者:行者123 更新时间:2023-12-01 12:40:26 29 4
gpt4 key购买 nike

我正在尝试制作自己的控件版本,例如 TextBox ,我想向其中添加一些自定义 UI。我想从这个类继承,这样用户仍然可以像调用普通文本框一样调用我的特殊文本框。我有以下内容:

// MySpecialTextBox.cs

public class MySpecialTextBox : TextBox
{
static MySpecialTextBox () { }

/* Some special properties */
}

在 XAML 中:
<Style TargetType="{x:Type MySpecialTextBox}">        
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MySpecialTextBox}">
<StackPanel>
<Rectangle Width="100" Height="3" Fill="Pink" /> <!-- My own fancy lay-out -->
<TextBox Text="{TemplateBinding Text}"/> <!-- This text box should 'inherit' ALL the properties from the caller -->
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

我的问题是现在, TextBox仅获取您在此模板中明确设置的属性,在这种情况下,仅获取 Text .我也想绑定(bind) Background , Foreground ,以及所有其他可能的属性。显然我可以做类似的事情:
<ControlTemplate TargetType="{x:Type MySpecialTextBox}">
<StackPanel>
<Rectangle Width="100" Height="3" Fill="Pink" />
<TextBox Text="{TemplateBinding Text}"
Background="{TemplateBinding Background}"
Foreground="{TemplateBinding Foreground}"
AcceptsReturn="{TemplateBinding AcceptsReturn}"
AllowDrop="{TemplateBinding AllowDrop}"
<!-- ETCETERA -->
/>
</StackPanel>
</ControlTemplate>

列出所有属性,但这感觉非常低效。有没有办法一次性绑定(bind)到整个 parent ?

最佳答案

放置另一个 TextBox 不是一个好主意另一个模板中的元素TextBox .当您覆盖其模板时,您应该始终编辑控件的默认模板。

因此,在 TextBox 的默认模板中你会发现以下元素:

    <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ScrollViewer x:Name="PART_ContentHost" Focusable="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
</Border>

这个边框负责绘制 TextBox .如果你使用这部分而不是你的内部 TextBox您将拥有所有其他 TextBox属性“继承”。

编辑:

完整的模板应该是:
 <Style TargetType="{x:Type my:MySpecialTextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type my:MySpecialTextBox}">
<StackPanel>
<Rectangle Width="100" Height="3" Fill="Pink" />
<!-- My own fancy lay-out -->
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ScrollViewer x:Name="PART_ContentHost" Focusable="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
</Border>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

关于wpf - 如何使用 TemplateBinding 继承控件的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25401629/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com