Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含事件和属性的布局_C#_Wpf_Xaml - Fatal编程技术网

C# 包含事件和属性的布局

C# 包含事件和属性的布局,c#,wpf,xaml,C#,Wpf,Xaml,如何制作具有绑定属性和事件的XAML布局?我快疯了 首先,它适用于聊天应用程序,单室聊天可以很好地工作,从某种意义上说,我可以在XAML中设计应用程序的布局,在这里、那里和任何地方使用名称属性,以便在C#中对其进行控制,但如果由于多个聊天室而多次重复此布局,则会有点问题。我完全是通过C#来完成的,这导致了数百行只定义控件并将它们添加到窗口中,其中一个问题是名称属性会发生冲突 我本来打算修改一个随机控件的ControlTemplate,例如一个Frame,但后来我遇到了定义自定义属性和事件的问题

如何制作具有绑定属性和事件的XAML布局?我快疯了

首先,它适用于聊天应用程序,单室聊天可以很好地工作,从某种意义上说,我可以在XAML中设计应用程序的布局,在这里、那里和任何地方使用名称属性,以便在C#中对其进行控制,但如果由于多个聊天室而多次重复此布局,则会有点问题。我完全是通过C#来完成的,这导致了数百行只定义控件并将它们添加到窗口中,其中一个问题是名称属性会发生冲突

我本来打算修改一个随机控件的ControlTemplate,例如一个Frame,但后来我遇到了定义自定义属性和事件的问题

我只是不知道怎样才能做我想做的事。我在很多地方请求帮助,但都没有用

我真的疯了,快要完全放弃了

我的目标是拥有多个房间的tabcontrol,我需要能够轻松访问每个房间的控件,以便修改内容。我只是不知道在哪里

编辑


公共聊天模板明显不同于私人聊天模板,因此我在这方面失败得如此之惨。

听起来像是数据模板的完美位置

首先,您需要一个“聊天室”类,它包含给定聊天室的所有状态信息。然后,主ViewModel需要有这些对象的集合。最后,使用可能与当前窗口几乎相同的DataTemplate设置选项卡控件

选项卡控件的外观如下所示:

<TabControl ItemsSource="{Binding ActiveRooms}">
  <TabControl.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
  </TabControl.ItemTemplate>
  <TabControl.ContentTemplate>
    <DataTemplate>
       ... (All your chat room stuff)
    </DataTemplate>
  </TabControl.ContentTemplate>
</TabControl>

... (你聊天室里所有的东西)

这样,无论何时创建新文件室(顺便说一句,ActiveRooms应该是一个ObservableCollection),它都会自动创建一组新控件,并将它们绑定到新文件室的实例属性

您可以使用MVVM模式来完成,这在处理WPF时更可取。 然而,这需要一些经验和大量的思维扭曲

幸运的是,如果您来自Windows窗体世界,则始终可以使用经典方法。 只需为聊天室创建一个包含GUI、数据、逻辑、事件处理程序等的用户控件,

将此聊天室用户控件的实例放在选项卡容器中,您就完成了。

看来您需要一个顺便说一句,您的挫折感可能来自试图以一种非预期的方式使用WPF,我建议您阅读Rachel的。我只是在您对事物外观有更多灵活性的基础上切换到WPF。而且,我真的不认为ItemsControl是我想要的。。。我使用TabControl查看了DataTemplates,但没有弄清楚如何根据传入消息的类型(公共/私有)在两个模板之间切换。绑定自定义属性和事件也是我找不到的。选项卡控件的模板只允许您有多个房间(与ItemControl相同)。public/private不应该影响这一点(因为这是在消息级别)。@user3439733是的,您需要一个ItemsControl。阅读相关文章。在WPF中,任何显示2个或更多相同“东西”(不管“东西”是什么)的UI都是ItemsControl。如果您想要干净、可维护的代码和易于自定义的UI,就没有办法解决这个问题。ItemTemplate会更复杂,因为它也会包含实际的选项卡,对吗?我还提到了公共/私有部分,因为它们包含不同的模板。例如,公共聊天室会有用户列表,而私人聊天室不会。这需要使用DataTemplateSelector,或者只是将用户列表可见性绑定到聊天室对象上的“IsPrivate”变量。项目模板只是标题(另一个Q/A,因此,如果您感兴趣,我可以添加链接到我的答案)。“选项卡”部分包含在控制模板中。