我正在根據UserControl類自定義WPF控件。這是一個簡單的複選框,帶有兩條對角線的矩形,在縮放整個控件時可以正確縮放。這裏是XAML:如何讓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>
我加DependencyProperty IsChecked
到CustomControl類。如果IsChecked
是true
對角線應該是可見的。如果IsChecked
是false
對角線應該隱藏。它看起來像這樣:
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"/>
在運行時,它完美的作品,但在設計時,如果我改變IsChecked
屬性在XAML我CustomCheckbox不會以圖形方式更新。例如,如果我設置IsChecked
到true
,對角線不會顯示:
<Controls:CustomCheckbox HorizontalAlignment="Left" VerticalAlignment="Top" IsChecked="True"/>
<Controls:CustomCheckbox HorizontalAlignment="Left" VerticalAlignment="Top" IsChecked="False"/>
這兩個控件是在設計時在視覺上相同。我錯過了什麼?
你想說我不應該創建一個新組件,而是爲CheckBox實例定義自定義模板?我對WPF仍然很陌生,但我猜想存在這樣做的全球方式? – Djuka