创建可在用户控件

时间:2015-08-19 04:04:54

标签: c# xaml dependency-properties win-universal-app

我在通用Windows中重新使用XAML的尝试让我遇到了很多砖墙,所以我在这里寻求帮助,因为我读过的任何内容似乎都表明我做错了所以我必须要失踪重要的事情。

我只是想创建一个自定义通用Windows用户控件,将一些属性公开给它所使用的位置。但是,当我尝试在使用用户控件的应用程序中的XAML中分配这些属性时,我得到一个错误抛出“XamlParseException:无法分配给属性”。如果有人帮助我理解我做错了什么以及为什么这是错误的,我会非常感激。

到目前为止,幸运的是,控件并不大,因为我没有足够的麻烦让它正常工作,因为它没有增长,所以我会在这里发布它 - 只是试图得到一个简单的汉堡覆盖用户控件所以我不为每个应用程序制作一个自定义的:

<UserControl
x:Class="POWU.Controls.HamburgerOverlay" x:Name="VM"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:POWU.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">
    <SplitView PaneBackground="{x:Null}" OpenPaneLength="{x:Bind Path=ExpandSize, Mode=OneWay}" IsPaneOpen="True">
        <SplitView.Pane>
            <Grid Background="#7F000000"></Grid>
        </SplitView.Pane>
        <SplitView.Content>
            <Grid></Grid>
        </SplitView.Content>
    </SplitView>
</UserControl>

背后的代码:

namespace POWU.Controls
{        
    public sealed partial class HamburgerOverlay : UserControl
    {
        public double ExpandSize
        {
            get
            {
                return (double)GetValue(ExpandSizeProperty);
            }
            set
            {
                SetValue(ExpandSizeProperty, value);
            }
        }

        // Using a DependencyProperty as the backing store for ExpandSize.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ExpandSizeProperty =
            DependencyProperty.Register("ExpandSize", typeof(double), typeof(HamburgerOverlay), new PropertyMetadata(200));

        public HamburgerOverlay()
        {
            this.InitializeComponent();
        }        
    }
}

编辑:我在这里添加了消耗用户控件的XAML ......

    <Grid>
        <po:HamburgerOverlay ExpandSize="300"></po:HamburgerOverlay>
    </Grid>

我认为我的问题是“PropertyMetadata”并且需要“DependencyPropertyCallback” - 但我不确定如何实现它。任何帮助将不胜感激。

EDIT2:我尝试在代码后面设置属性而不是XAML(应该首先尝试这个)并得到一个更具体的例外:

 "Method not found: 'Void POWU.Controls.HamburgerOverlay.set_ExpandSize(Double)'."

使用堆栈跟踪:

   at PODebugging.MainPage..ctor()
   at PODebugging.PODebugging_XamlTypeInfo.XamlTypeInfoProvider.Activate_4_MainPage()
   at PODebugging.PODebugging_XamlTypeInfo.XamlUserType.ActivateInstance()
   at Windows.UI.Xaml.Controls.Frame.Navigate(Type sourcePageType, Object parameter)
   at PODebugging.App.OnLaunched(LaunchActivatedEventArgs e)

现在我真的很困惑......一种方法怎么会消失?

1 个答案:

答案 0 :(得分:1)

我找到了答案:

我需要做的第一件事就是将我的类库的构建从x86切换到&#34; AnyCPU&#34; - 即使我在两个项目中都在构建x86,这也解决了找不到属性的问题。

我需要做的第二件事,就像我应该注意到的那样,修复了默认值。这是一个愚蠢的错误,但它让我的约束力变得困惑:

此:

public static readonly DependencyProperty ExpandSizeProperty =
        DependencyProperty.Register("ExpandSize", typeof(double),
            typeof(HamburgerOverlay), new PropertyMetadata(200));

需要改为:

 public static readonly DependencyProperty ExpandSizeProperty =
        DependencyProperty.Register("ExpandSize", typeof(double),
            typeof(HamburgerOverlay), new PropertyMetadata((double)200));

如果我更加密切关注,这应该是显而易见的,但我不是。

叹息。另一堵砖墙攀爬。我确定我会在10分钟内击中另一个。