2017-03-08 5 views
1

私はUserControlクラスに基づいてカスタムWPFコントロールを作成しています。それは、単純なチェックボックスです。四角形の2つの線は、コントロール全体を拡大/縮小すると正しく拡大/縮小されます。私はCustomControlクラスにDependencyProperty IsCheckedを追加WPF UserControlをデザイン時に更新する方法

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

:ここではXAMLです。 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はグラフィカルに更新されません。私はtrueIsCheckedを設定した場合、斜めの線が表示されません。

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

これら2つのコントロールは、設計時に視覚的に同じです。私は何が欠けていますか?

答えて

1

引用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のテンプレートを交換します。

+0

あなたは新しいコンポーネントを作成すべきではなく、CheckBoxインスタンスのカスタムテンプレートを定義するべきだと言いたいのですか?私はまだWPFの新機能ですが、これを実行するグ​​ローバルな方法が存在すると思いますか? – Djuka

関連する問題