2009-02-03 65 views
2

我在使用UserControls在XAML中工作时遇到了主要问题 - 我花了数小时试图找出所有问题,但无处可寻,无法找到我出错的地方。
我遇到的主要问题是当我创建一个UserControl例如一个简单的显示对象不同的颜色 - 我已经成功地为此创建了一个属性,并且可以在设计时将颜色分配给此用户控件,并且它工作 - 显示绿色,红色等
但是,当我给这个UserControl一个名称,所以我可以在运行时分配这个属性,我得到一个错误“无法创建类型'MyUserControl'的实例”,如果我删除用户控件的名称 - 我可以在设计时添加尽可能多的数据,它们都可以工作,但是只要我指定一个名称或x:名称就会中断,我无法弄清楚原因。
有可能创建一个标签,例如它有一个名称,我可以在代码中引用它 - 为什么不是我自己的控件 - 不管它有多简单。XAML/WPF中UserControls的问题是什么?

我的主要问题是:

  1. 为什么给我的用户一个 名称或X:名称停止工作呢?
  2. 如何在 窗口中使用多个 相同类型的UserControls?
  3. 如何从UserControl外部访问UserControl的画布,标签 等或UserControl外部的 ?
  4. 如何在运行时或在设计时使用代码或XAML实例化UserControl: ?

我不明白为什么这些应该是如此困难 - 我无法弄清楚这个问题,所以请任何人都可以帮忙,那么谢谢!


这里是我的用户的XAML和代码

<UserControl x:Class="Device.Draco" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="20" Height="36" x:Name="Icon"> 
    <Canvas Width="20" Height="36" HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <Rectangle Height="36" Width="20" Fill="{Binding ElementName=Icon, Path=ZuneColour}" Canvas.Left="0" Canvas.Top="0" RadiusX="1" RadiusY="1"> 
      <Rectangle.BitmapEffect><OuterGlowBitmapEffect GlowColor="Black" GlowSize="2" /></Rectangle.BitmapEffect> 
     </Rectangle> 
     <Rectangle Canvas.Left="1" Canvas.Top="1" Height="24" Stroke="#191616" Width="18"> 
      <Rectangle.Fill> 
       <LinearGradientBrush> 
        <GradientStop Offset="1" Color="#231F20"/> 
        <GradientStop Offset="0" Color="#524F4F"/> 
        <LinearGradientBrush.Transform> 
         <RotateTransform Angle="68" CenterX="0.5" CenterY="0.5"/> 
        </LinearGradientBrush.Transform> 
       </LinearGradientBrush> 
      </Rectangle.Fill> 
     </Rectangle> 
     <Rectangle Canvas.Left="5.5" Canvas.Top="25" Height="9" Width="9" RadiusX="3" RadiusY="3"> 
      <Rectangle.Fill> 
       <LinearGradientBrush> 
        <GradientStop Offset="0" Color="#66000000"/> 
        <GradientStop Offset="1" Color="#22000000"/> 
       </LinearGradientBrush> 
      </Rectangle.Fill> 
      <Rectangle.Stroke> 
       <LinearGradientBrush> 
        <GradientStop Offset="0" Color="#66FFFFFF"/> 
        <GradientStop Offset="1" Color="#22FFFFFF"/> 
       </LinearGradientBrush> 
      </Rectangle.Stroke> 
     </Rectangle> 
    </Canvas> 

这是用户控件的代码 - 添加了所有的风格和充满简单XAML来消除此为原因 - 代码背后是下面:

Namespace Device 
    Partial Public Class Draco 
     Inherits System.Windows.Controls.UserControl 
     Public Shared ZuneColorProperty As DependencyProperty = _ 
     DependencyProperty.Register("ZuneColour", GetType(Brush), GetType(Device.Draco)) 
     Public Property ZuneColour() As Brush 
      Get 
       Return GetValue(ZuneColorProperty) 
      End Get 
      Set(ByVal Value As Brush) 
       SetValue(ZuneColorProperty, Value) 
      End Set 
     End Property 
    End Class 
End Namespace 

下面是我如何使用它目前

为例3210
+0

你能否提供一些代码? – 2009-02-03 11:30:39

+0

这段代码现在连接到问题 – RoguePlanetoid 2009-02-03 15:02:05

回答

1

1。如果添加Namex:Name会导致UserControl失败,那么可能还有其他问题。此外,使用x:Name超过Name

2。以下代码将使用多个控件:

<WrapPanel> 
    <ui:Draco ZuneColour="Pink" Width="20" /> 
    <ui:Draco ZuneColour="Red" Width="20" /> 
    <ui:Draco ZuneColour="Orange" Width="20" /> 
</WrapPanel> 

3。 UserControl是一个类。 UserControl的XAML是私人的,除非通过模板公开。因此,除非您提供方法,否则UserControl的使用者将覆盖模板,否则他们无法控制内部。对于你的用户控件也是一样,它不能和它的父类的内部一起玩。如果你需要紧密耦合,我建议你不要使用UserControl。

4。鉴于以下XAML:

<StackPanel x:Name="ZunePanel" /> 

您可以使用后面的下面的代码:

ZunePanel.Children.Add(new Draco()); 
2

我不确定我可以在没有看到它的源代码的情况下解决你的UserControl的具体问题。

但是我可以回答第3部分。如果您给控件模板的一部分命名,则可以从控件代码中检索该部分。如果需要,您可以从那里公开地将其退回。

<ControlTemplate TargetType="{x:Type l:MyUserControl}"> 
    <Button x:Name="PART_button">My Button</Button> 
</ControlTemplate> 

[TemplatePart(Name = "PART_button", Type = typeof(Button))] 
public class MyUserControl:UserControl 
{ 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     Button button = (Button)base.GetTemplateChild("PART_button"); 

     // do something with the button control 
    } 

} 

属性说,这种控制需要Button类型的“PART_button”控制在它的模板。然后在OnApplyTemplate方法中,您可以拨打GetTemplateChild来检索您需要的部分。