代码之家  ›  专栏  ›  技术社区  ›  Muckers Mate

WPF用户控件设计时访问内部用户控件

  •  0
  • Muckers Mate  · 技术社区  · 12 年前

    我有一个用户控件a,其中包含另一个用户控制B。

    用户控件A具有依赖属性 DeviceColour 。这决定了内部用户控件B的颜色。

    此Dependency属性的注册如下:

    public static readonly DependencyProperty DeviceColourProperty = DependencyProperty.Register("DeviceColour",
                  typeof(vhBase.DeviceColours),typeof(ucBaseDevice),new FrameworkPropertyMetadata(vhBase.DeviceColours.Gray,
                  FrameworkPropertyMetadataOptions.AffectsRender,new PropertyChangedCallback(DeviceColourProperty_PropertyChanged)));
    
    public  vhBase.DeviceColours DeviceColour
    {
        get { return (vhBase.DeviceColours)GetValue(DeviceColourProperty); }
        set { SetValue(DeviceColourProperty, value); }
    }
    
    private static void DeviceColourProperty_PropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        ucBaseDevice device = (ucBaseDevice)obj;
        device.VisualDevice.DeviceColour = (vhBase.DeviceColours)e.NewValue;      
    }
    

    在上述属性改变事件中, VisualDevice 是指向内部用户控件B的属性,如下所示:

    public override vhBase VisualDevice
    {
        get {  return vhMain; }
    }
    

    vhMain 是用户控件B,我可以在XAML设计器中查看和操作该控件。

    我在设计时遇到的问题是 可视化设备 似乎返回NULL,即。 vhMain ,用户控件为空,因此“对象引用未设置为实例……”。

    这在运行时有效,但我需要它在设计时也有效。

    正如你可能已经意识到的,我对DP和WPF不太了解,我发现自己在兜圈子。

    有人能帮忙吗?

    谢谢

    1 回复  |  直到 12 年前
        1
  •  0
  •   Alex Skiba    12 年前

    我做了一个简单的例子,说明如何将孩子的财产绑定到父母的财产。 我使用Color属性作为示例,但这对于每个属性类型都是一样的。

    有两个用户控件: ControlB 带有DP“颜色”和 ControlA 带DP DeviceColour . 控制B 只需将其背景绘制为指定颜色:

    <UserControl x:Class="WpfApplication1.ControlB" <!--skipped--> Name="controlB">
        <Grid>
            <Grid.Background>
                <SolidColorBrush Color="{Binding ElementName=controlB, Path=Colour}" />
            </Grid.Background>
        </Grid>
    </UserControl>
    

    还有如何在ControlA中从XAML绑定财产:

    <UserControl x:Class="WpfApplication1.ControlA" <!--skipped--> Name="controlA">
        <Grid>
            <my:ControlB Colour="{Binding ElementName=controlA, Path=DeviceColour}" />
        </Grid>
    </UserControl>
    

    还有如何使用ControlA:

    <Window x:Class="WpfApplication1.MainWindow" <!--skipped-->>
        <Grid>
            <my:ControlA DeviceColour="Green" />
        </Grid>
    </Window>