【问题标题】:How to use a public method in a custom control without using x:Name如何在自定义控件中使用公共方法而不使用 x:Name
【发布时间】:2016-01-01 02:20:03
【问题描述】:

我有我的自定义控件 MyControl,它有一个公共方法 Start()。

public partial class MyControl : UserControl
{
    // This must be private.
    private int _idNumber;

    public MyControl()
    {
        InitializeComponent();
    }

    public void Start(int idNumber)
    {
        _idNumber = idNumber;
    }
}

在主窗口中,我放置了一个带有 x:Name="myControl" 的 MyControl。

<Window x:Class="MyNameSpace.MainWindow"
        xmlns:local="clr-namespace:MyNameSpace">
    <Grid>
        <local:MyControl x:Name="myControl"/>
    </Grid>
</Window>

在 MainWindow 的 Start 方法中,我使用 x:Name 调用 MyControl 的 Start 方法。

public partial class MainWindow : Window
{
    // This must be private
    private int _myContolId;

    public MainWindow()
    {
        InitializeComponent();
    }

    public void Start()
    {
        // ID must be set here.
        _myControlId = 1;
        myControl.Start(_myControlId);
    }
}

如何不使用 x:Name 做同样的事情?

请注意,MyControl 的 Loaded 事件在我的情况下是无效的,因为 MyControl 的 Start() 方法必须在它作为可视元素加载之前被调用。

在MyControl的构造函数或初始化时调用Start也是无效的,因为int参数idNumber必须在MainWindow的Start方法中设置。

此外,对于 setter 和 getter,MyControl 的 _idNumber 和 MainWindow 的 _myContolId 都必须是私有的。

【问题讨论】:

  • 在MyControl的构造函数中调用Start?还是在重写的 OnInitialized 方法中?
  • @Clemens 感谢您的快速回复,但这是不可能的。我在问题的编辑版本中解释了我真正想做的事情。

标签: c# wpf xname


【解决方案1】:

处理用户控件的初始化事件。 &lt;local:MyControl x:Name="myControl" Initialized="myControl_Initialized"/&gt;

您选择处理 Loaded 还是 Initialized 取决于您的 要求。如果您不需要读取元素属性,则打算 重置属性,不需要任何布局信息,初始化 可能是更好的事件。如果你需要所有的属性 元素可用,您将设置属性 可能会重置布局,加载可能是更好的事件 采取行动。

来源:FrameworkElement.Initialized Event

您应该在下面的代码中创建 UserControl 并添加它:

 public partial class MainWindow : Window
 {
// This must be private
private int _myContolId;

public MainWindow()
{
    InitializeComponent();
}

public void Start()
{
    // ID must be set here.
    _myControlId = 1;
    MyControl myControl = new MyControl();
    myControl.Start(_myControlId);

    GridContainer.Children.Add(myControl);
}

}

这将解决您的问题。如果您声明一个元素/控件 XAML,那么它将在 XAML 文件被解析时创建。

【讨论】:

  • 感谢您的回复,但这是不可能的。我在问题的编辑版本中解释了我真正想做的事情。
  • 谢谢,但在我的实际代码中,XAML 结构要复杂得多,在代码隐藏中添加元素非常困难。
  • 使用可以使用一个桥(自定义类),从主窗口填充它的属性,然后处理你的用户控件的初始化事件并从桥对象中获取这些属性等。这个桥接类可以声明为 Application/Window 资源,因此 MainWindow 和 UserControl 都可以使用它。
  • 非常感谢您的回答。这将实现我想要的。
  • @user4134476 为什么说不可能?处理Initialized 事件似乎没问题。它发生在Loaded 之前,你不是说Start 也应该在控件初始化之前调用,对吗?这是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多