将控件添加到用户控件

时间:2019-09-16 01:03:37

标签: c# wpf

我使用WPF创建了一个用户控件,该控件应将控件列表作为其内容。 我成功创建了这样的用户控件,但是遇到了无法命名添加的任何子控件的问题。

以下是用户控件的代码:

public static DependencyProperty InnerContentProperty = DependencyProperty.Register("TaskListItems", 
typeof(UIElement), typeof(TaskList));

public UIElement TaskListItems {
    get { return (UIElement)GetValue(InnerContentProperty); }
    set { SetValue(InnerContentProperty, value); }
}

和XAML(相关部分):

<ScrollViewer>
    <ContentControl Content="{Binding TaskListItems, RelativeSource={RelativeSource AncestorType={x:Type local:TaskList}}}"/>
</ScrollViewer>

然后,实现如下所示:

<uc:TaskList Grid.Column="0" HeaderText="Daily Task List" FooterText="Completed: 10">
    <uc:TaskList.TaskListItems>
        <StackPanel>
            <Button Content="Some Button"/>
            <Button Content="Some Button 2"/>
         </StackPanel>
    </uc:TaskList.TaskListItems>
</uc:TaskList>

因此,当我向用户控件中添加控件(例如按钮)时,一切工作正常,除了我无法给按钮命名并收到错误消息:

Cannot set Name attribute value 'test' on element 'Button'. 'Button' is under the scope of element 'TaskList', which already had a name registered when it was defined in another scope

所以我的问题是,有没有一种方法可以在功能上执行相同的操作,还可以让我给控件命名?

编辑以获取更多信息:

task list design

task list item design

我要寻找的是一个可以包含我创建的其他用户控件列表的用户控件。
这些“列表项”控件每个都有四个按钮(文本位也是一个按钮):

文本按钮只会打开一个窗口,其中包含有关所选任务的信息。
复选标记按钮应该创建一个事件以请求任务完成。
垂直省略号按钮会打开一个窗口,您可以在其中修改任务。
最后,应该使用x按钮创建一个事件,以请求取消/删除所选任务。

问题在于创建事件并订阅事件。到目前为止,我有两个事件处理程序,分别在每个按钮click事件中调用。

public event EventHandler<TaskItemEventArgs> TaskCompletedEvent;
public event EventHandler<TaskItemEventArgs> TaskRemoveRequestEvent;

private void acceptBtn_click(object sender, RoutedEventArgs e)
{
    TaskCompletedEvent?.Invoke(this, new TaskItemEventArgs() { EventText = "Task Completed!" });
}

private void removeBtn_click(object sender, RoutedEventArgs e)
{
    TaskRemoveRequestEvent?.Invoke(this, new TaskItemEventArgs() { EventText = "Task Remove Requested!" });
}

现在的问题是,我不知道将这些事件订阅到哪里,以便修改调用该事件的“任务项”控件。我当时想我应该只将其添加到父控件中,但是我不知道该怎么做,因为这里的所有控件都是动态的。

现在我考虑一下,我想您不需要上述任务的控件名称。动态控件让我感到困惑。

1 个答案:

答案 0 :(得分:0)

经过一些试验和谷歌搜索,我实际上使代码现在可以工作了。我在TaskList控件中动态创建一个堆栈面板,当我单击右上角的“加号”按钮时,将打开一个对话框,允许我描述我的任务。之后,我动态创建一个TaskListItem并使用在TaskList中创建的一些方法订阅它的事件。最后,我将TaskListItem添加到StackPanel中,如果要对其进行修改,我可以只修改要求编辑的specifc对象。效果很好。