基本クラスUserControlからカスタムコントロール(私の最初)を作成しましたが、将来のコントロールを作成するときにそれを継承できなくなります。
これがカスタムコントロールテンプレートです
<Style TargetType="{x:Type local:LoadOverlayUserControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:LoadOverlayUserControl}">
<Grid>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"/>
<Border Visibility="{TemplateBinding OverlayVisibility}"
Background="{TemplateBinding OverlayColor}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<dxe:ProgressBarEdit />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ソースコードは次のとおりです。
public class LoadOverlayUserControl : UserControl
{
static LoadOverlayUserControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(LoadOverlayUserControl), new FrameworkPropertyMetadata(typeof(LoadOverlayUserControl)));
}
#region Overlay Visibility
public static readonly DependencyProperty OverlayVisibilityProperty = DependencyProperty.Register("OverlayVisibility",
typeof(Visibility),
typeof(LoadOverlayUserControl),
new PropertyMetadata(Visibility.Hidden));
private Visibility OverlayVisibility
{
get
{
return (Visibility)this.GetValue(OverlayVisibilityProperty);
}
set
{
this.SetValue(OverlayVisibilityProperty, value);
}
}
#endregion
#region Overlay Color
public static readonly DependencyProperty OverlayColorProperty = DependencyProperty.Register("OverlayColor",
typeof(Color),
typeof(LoadOverlayUserControl),
new PropertyMetadata(Color.FromRgb(0,0,0)));
public Color OverlayColor
{
get
{
return (Color)this.GetValue(OverlayColorProperty);
}
set
{
this.SetValue(OverlayColorProperty, value);
}
}
#endregion
public void SetLoading(bool IsLoading)
{
if (IsLoading)
{
OverlayVisibility = System.Windows.Visibility.Visible;
}
else
{
OverlayVisibility = System.Windows.Visibility.Hidden;
}
}
}
私が遭遇した問題は、このカスタムコントロールから継承すると、テンプレートを無視しているように見え、空のコントロールになってしまうことです。
これは、このカスタムコントロールから継承している新しいコントロールの例です。
<custom:LoadOverlayUserControl x:Class "ChildControl"
...
...
...>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../ResourceDictionaries/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
...
</Grid>
</custom:LoadOverlayUserControl>
そして、これが私が新しいコントロールをどのように使用しているかです。読みやすくするために名前空間を省略しましたが、何か注意が必要な場合を除いて、名前空間が正しいことを保証します。
<UserControl x:Class "SomeOtherControl">
<Grid>
<StackPanel>
<my:ChildControl />
</StackPanel>
</Grid>
</UserControl>
カスタムコントロールの背後にある考え方は、半透明の不透明度の上に「現在読み込んでいる」オーバーレイを適用できるようにしたいコントロールです。