3

基本クラス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>

カスタムコントロールの背後にある考え方は、半透明の不透明度の上に「現在読み込んでいる」オーバーレイを適用できるようにしたいコントロールです。

4

1 に答える 1

2

WPFでカスタムコントロールを作成する場合は、いくつかの方法を変更する必要があります。

ContentControlまず、からではなく、から継承しUserControlます。

次に、リソースディクショナリGeneric.xamlをThemesフォルダーの下に配置する必要があります。

第三に、派生したコントロールクラスもWPFコントロールである必要があります。つまり、デフォルトのスタイルキーをオーバーライドし、Generic.xamlでスタイルを定義する必要があります。

于 2013-01-09T17:27:16.577 に答える