继承自定义控件

时间:2013-01-03 10:57:48

标签: c# wpf

我已经从基类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>

自定义控件背后的想法是我希望能够在半透明不透明度的基础上应用“当前正在加载”叠加层的控件。

1 个答案:

答案 0 :(得分:2)

如果要在WPF中创建自定义控件,则需要采用不同的方式。

首先,继承自ContentControl,而不是UserControl

其次,您的资源字典Generic.xaml应位于Themes文件夹下。

第三,你的派生控件类也需要是WPF控件。也就是说,他们需要覆盖默认样式键,并在Generic.xaml中定义它们的样式。