自定义控件内的控件无法移动。

3

我有一个自定义控件(称为MyContainer),它只是一个带有Canvas的ScrollViewer。

我可以像在Canvas中一样向MyContainer添加控件,但在XAML设计器中,这些控件不能像在普通Canvas中那样移动;它们无法用鼠标移动。

以下是MyContainer代码:

[ContentProperty("Children")]
public class MyContainer : ScrollViewer, IAddChild    
{
    private Canvas _innerCanvas;

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public UIElementCollection Children
    {
        get { return _innerCanvas.Children; }
    }

    public MyContainer()
    {
        this._innerCanvas = new Canvas();
        this.Content = _innerCanvas;

        this.Loaded += MyContainer_Loaded;
    }

    void MyContainer_Loaded(object sender, RoutedEventArgs e)
    {
        _innerCanvas.Height = this.ActualHeight;
        _innerCanvas.Width = this.ActualWidth;
    }

    void IAddChild.AddChild(object value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }

        UIElement uie = value as UIElement;

        if (uie == null)
        {
            throw new ArgumentNullException("value");
        }

        _innerCanvas.Children.Add(value as UIElement);
    }

    void IAddChild.AddText(string text)
    {
        ; 
    }
}

我错在哪里了?
PS:请避免回复“不要使用编辑器,只使用XAML代码”; 我需要通过图形界面使用户控件可用。

看起来你正在使用C#生成控件。设计器只能使用XAML。 - H H
控件可以通过从工具箱中拖放或使用XAML代码添加,例如<MyCanvas><TextBox /><TextBox /></MyCanvas>。 - rPulvi
1个回答

2
我认为您没有选择正确的基类。在 WPF 中,有一些可扩展性点应该用于某些类型的 UI 元素,而我猜设计师是硬编码到这些类中的。
不同类型的 UI 元素包括:
1. 可视化元素:它们通常派生自 FrameworkElement,其目的是显示用户通常不与之交互的内容(例如文本块)。 2. 控件:它们代表用户可以与之交互的内容,例如按钮、复选框、文本框、滚动查看器等。它们通常派生自 Control 或 ContentControl。 3. 面板:它们的目的是布局其他 UI 元素,Grid 或 StackPanel 是其中的例子。它们都派生自 Panel 基类。 4. 项控件:它们通常提供对多个项目的选择。ListBox、ComboBox 和 TreeView 是它们的示例。它们都派生自 ItemsControl。
另一个重要的事情是,ContentControlItemsControl可以显示任何对象,而不仅限于那些可以呈现自己的对象。它们使用 WPF 数据模板机制实现(默认情况下,在非可渲染对象上调用 ToString 并将结果字符串放入 TextBlock 中)。
根据您的代码,我会认为您要么想要实现一个面板,要么想要实现一个项控件。对于面板,您应该了解 WPF 的 Measure - Arrange - Render 循环以及如何使用它来布置面板的子元素
实现一个项控件有点难,因为基本上一个项控件使用包裹每个显示对象的实际内容的项(例如ListBoxItem),一个用于布局这些项的面板,一个项容器生成器以动态创建子项,当然你也可以使用样式和模板。大多数项控件还包括滚动查看器。如果你想了解更多关于项控件的信息,我强烈建议阅读 Dr. WPF的 "Items Controls: A to Z" 博客系列。
我没有尝试过,但我相信如果您选择正确的基类来扩展,那么您可以在设计师中正确地使用您的控件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接