WPF CustomControl样式未由子控件继承

时间:2018-08-21 21:57:34

标签: c# wpf wpf-controls custom-controls

我正在尝试学习如何制作自定义控件。我整个下午都在搜索,但是无法让我的属性供子控件使用。

例如,我的TextBox子类是TextBoxCalculator。在控件模板中,我有一个文本框和一个弹出窗口。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Controls">

    <Style TargetType="local:TextBoxCalculator" BasedOn="{StaticResource {x:Type TextBox}}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:TextBoxCalculator">

                    <Grid Name="ucGrid">
                        <TextBox Name="AmountTb" Text="{Binding Text }">
                            <!--<TextBox.Style>
                                <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                                ... How can I make this textbox style follow the one specified in the window XAML?
                                </Style>
                            </TextBox.Style>-->
                        </TextBox>
                        <Popup Name="calPopup"  Placement="Top" StaysOpen="False">
                          ... some content
                        </Popup>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

在我的窗口中,我使用如下控件:

    <Style TargetType="{x:Type controls1:TextBoxCalculator}" x:Key="RightCellEditCalc">
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
        <Setter Property="TextAlignment" Value="Right"/>
        <Setter Property="Background" Value="Red"/>
        <Setter Property="BorderThickness" Value="0"/>
    </Style>

<controls1:TextBoxCalculator Text="{Binding Amount, UpdateSourceTrigger=LostFocus}" 
                        DecimalPlaces="2"
                        AutoPlaceDecimalPoint="True"
                        Style="{StaticResource RightCellEditCalc}"
                        Background="Green">
</controls1:TextBoxCalculator>

我希望背景为绿色,但背景为白色。 另一方面,TextAlignment = Right似乎正在工作。我想念什么?

2 个答案:

答案 0 :(得分:1)

在另一个自定义TextBox控件的ControlTemplate中定义TextBox元素是没有意义的。

如果要为控件创建自定义模板并将其基于TextBox控件的默认模板,则可以在Visual Studio的设计模式下右键单击TextBox元素,或者在Blend中,选择“编辑模板”->“编辑副本”以将默认模板复制到XAML标记中,然后根据需要对其进行编辑。

这是在Windows 8及更高版本上的外观:

<ControlTemplate TargetType="{x:Type 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>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Opacity" TargetName="border" Value="0.56"/>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
        </Trigger>
        <Trigger Property="IsKeyboardFocused" Value="true">
            <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

它使用TemplateBindings将模板中Border元素的属性绑定到TextBox控件本身的相应属性。

答案 1 :(得分:0)

您没有绑定background,而是将其绑定到ControlTemplate中您想要的位置。例如

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:Controls">

<Style TargetType="local:TextBoxCalculator" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:TextBoxCalculator">

                <Grid Name="ucGrid">
                    <TextBox Name="AmountTb" Text="{Binding Text }" Background="{TemplateBinding Background}">
                        <!--<TextBox.Style>
                            <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                            ... How can I make this textbox style follow the one specified in the window XAML?
                            </Style>
                        </TextBox.Style>-->
                    </TextBox>
                    <Popup Name="calPopup"  Placement="Top" StaysOpen="False">
                    </Popup>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

您可以立即使用背景。