繁体   English   中英

如何在设计时获取WPF UserControl更新?

[英]How to get WPF UserControl to update at design time?

我正在基于UserControl类制作自定义WPF控件。 这是一个简单的复选框,带有两条对角线的矩形,当我缩放整个控件时可以正确缩放。 这是XAML:

<UserControl x:Name="Container" 
     x:Class="MyProject.Controls.VirmanCheckbox"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:MyProject.Controls"
     mc:Ignorable="d"
     d:DesignHeight="50" d:DesignWidth="50" BorderThickness="1" BorderBrush="Black" Width="50" Height="50" Cursor="Hand" IsTabStop="True" Focusable="True" KeyUp="Grid_KeyUp" GotFocus="Container_GotFocus" LostFocus="Container_LostFocus">
<Grid MouseUp="Grid_MouseUp" Background="#00000000">
    <Line x:Name="diagonal1" X1="0" Y1="0" X2="{Binding Width, ElementName=Container}" Y2="{Binding Height, ElementName=Container}" Stroke="{Binding ElementName=Container, Path=BorderBrush}" StrokeThickness="{Binding ElementName=Container, Path=BorderThickness}" Visibility="Hidden"/>
    <Line x:Name="diagonal2" X1="0" Y1="{Binding Height, ElementName=Container}" X2="{Binding Width, ElementName=Container}" Y2="0" Stroke="{Binding ElementName=Container, Path=BorderBrush}" StrokeThickness="{Binding ElementName=Container, Path=BorderThickness}" Visibility="Hidden"/>
</Grid>

我将DependencyProperty IsChecked添加到CustomControl类。 如果IsCheckedtrue对角线应可见。 如果IsCheckedfalse对角线应隐藏。 看起来像这样:

public partial class CustomCheckbox : UserControl
{
    public static readonly DependencyProperty IsCheckedProperty;

    static CustomCheckbox()
    {
        IsCheckedProperty = DependencyProperty.Register(
            name: "IsChecked",
            propertyType: typeof(Boolean),
            ownerType: typeof(VirmanCheckbox),
            typeMetadata: new FrameworkPropertyMetadata(
                defaultValue: false, 
                flags: FrameworkPropertyMetadataOptions.AffectsRender
            )
        );
    }

    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set
        {
            var old = (bool)GetValue(IsCheckedProperty);
            SetValue(IsCheckedProperty, value);

            if (old != value)
            {
                if (value)
                {
                    diagonal1.Visibility = Visibility.Visible;
                    diagonal2.Visibility = Visibility.Visible;
                }
                else
                {
                    diagonal1.Visibility = Visibility.Hidden;
                    diagonal2.Visibility = Visibility.Hidden;
                }
            }
        }
    }
 }

当我在项目中使用此控件时,将得到以下XAML:

<Controls:CustomCheckbox HorizontalAlignment="Left" VerticalAlignment="Top"/>

在运行时,它可以完美运行,但是在设计时,如果我更改XAML中的IsChecked属性,则CustomCheckbox不会以图形方式更新。 例如,如果我将IsChecked设置为true ,对角线将不会显示:

<Controls:CustomCheckbox HorizontalAlignment="Left" VerticalAlignment="Top" IsChecked="True"/>
<Controls:CustomCheckbox HorizontalAlignment="Left" VerticalAlignment="Top" IsChecked="False"/>

在设计时,这两个控件在外观上是相同的。 我想念什么?

引用MSDN

由于XAML处理器当前针对属性设置的行为的WPF实现完全绕过了包装器,因此您不应为自定义依赖项属性在包装器的集合定义中添加任何其他逻辑。 如果将这样的逻辑放在集合定义中,则当在XAML中而不是在代码中设置属性时,将不会执行该逻辑。

您应该改为注册PropertyChangedCallback

public partial class CustomCheckbox : UserControl
{
    public CustomCheckbox()
    {
        InitializeComponent();
    }

    #region IsChecked
    public static readonly DependencyProperty IsCheckedProperty =
        DependencyProperty.Register("IsChecked",
            typeof(bool), typeof(CustomCheckbox),
            new FrameworkPropertyMetadata(
                false, 
                FrameworkPropertyMetadataOptions.AffectsRender,
                IsCheckedPropertyChanged));

    public bool IsChecked
    {
        get { return (bool)GetValue(IsCheckedProperty); }
        set { SetValue(IsCheckedProperty, value); }
    }
    #endregion

    #region IsCheckedPropertyChanged
    private static void IsCheckedPropertyChanged
        (DependencyObject source, DependencyPropertyChangedEventArgs e)
    {
        if (source is CustomCheckbox)
        {
            CustomCheckbox control = source as CustomCheckbox;
            bool value = (bool)e.NewValue;

            if (value)
            {
                control.diagonal1.Visibility = Visibility.Visible;
                control.diagonal2.Visibility = Visibility.Visible;
            }
            else
            {
                control.diagonal1.Visibility = Visibility.Hidden;
                control.diagonal2.Visibility = Visibility.Hidden;
            }
        }
    }
    #endregion
}

附带说明一下,在WPF中,您通常会交换常规CheckBox的模板以更改其外观。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM