簡體   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