【问题标题】:How to group controls inside Grid for reuse in XAML?如何在 Grid 中对控件进行分组以便在 XAML 中重用?
【发布时间】:2010-09-24 07:03:11
【问题描述】:

在我的应用程序中,我有一些逻辑上属于一起的控件,并且在不同的窗口中的许多地方重复使用。控件始终放置在网格内。

不是每次我想使用它们时都复制控件(和后面的代码),我想在单个 xaml 文件中将它们定义和维护为单个 UserControl。

我现在有这个:

<Grid>
    <Grid.ColumnDefinitions>
        [ColumnDefinitions...]
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        [RowDefinitions...]
    </Grid.RowDefinitions>

    <StackPanel Grid.Column="0" Grid.Row="0">
        <TextBlock Text="Caption" />
        <Border Padding="2" x:Name="myBorder">
            <TextBox TabIndex="1" x:Name="myTxt"/>
        </Border>
    </StackPanel>
    <ListBox x:Name="myList" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Margin="5,50,5,0" Height="100" VerticalAlignment="Top" Visibility="Collapsed" />

    [More controls..]
</Grid>

但我想重用这部分:

    <StackPanel Grid.Column="0" Grid.Row="0">
        <TextBlock Text="Caption" />
        <Border Padding="2" x:Name="myBorder">
            <TextBox TabIndex="1" x:Name="myTxt"/>
        </Border>
    </StackPanel>
    <ListBox x:Name="myList" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Margin="5,50,5,0" Height="100" VerticalAlignment="Top" Visibility="Collapsed" />

作为单个控件 - 但是在使用控件时如何定义 Grid.Column(以某种方式将其作为参数提供)? - 以及如何设置 Grid.RowSpan 值(即使代码已移至新的 xaml 文件,并且未在网格内定义)?

有没有cmets?

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    将它们制成一个单独的用户控件,然后将其包含在您的项目中。

    如果你使用的是 Blend,那真的很简单,只需选择所有控件,右键单击并 Make into Usercontrol。

    【讨论】:

    • 我没有使用混合,但我会考虑手动创建一个单独的用户控件(在 VS 2008 中)。进一步的 cmets 或想法将不胜感激。
    【解决方案2】:

    你也可以把它变成一个资源。 在 ResourceDictionary 中定义它,并将字典包含在您想要使用它的地方。 有一个问题 - 资源字典每次都返回相同的实例 - 所以你必须添加属性 x:Shared="false"。

    但是 wpf 的方法是弄清楚如何使用 DataTemplate 来做到这一点:)

    【讨论】:

    • 感谢您的回复。我将研究 DataTemplates ;-) 是否有任何指向良好运行的链接?
    • 我在 google 上找到了很多 - 这似乎是更好的之一:code-magazine.com/Article.aspx?quickid=0907111
    • 感谢您的链接。它或多或少涵盖了我对 DataTemplates 的基本知识。现在,我的问题归结为一个事实,即我新创建的 DataTemplate 必须包含两个控件(StackPanel 和 ListBox),这是不可能的(“模板只能有一个根元素”)。但我不能只将两个控件包装在 DataTemplate 内的网格中 - 这会使 ListBox 的 Grid.RowSpan="2" 应用于我的“本地”网格,而不是“父”网格,即我的自定义 UserControl旨在通过放置在内部(这有意义吗?)。不知道怎么解决?
    • 我尝试将“DataType="{x:Type Grid}"” 添加到 DataTemplate,但这并不能解决“...只能有一个根元素”...?
    • 如果你想拉伸列表框,最简单的可能是使用 DockPanel - 你不能用 StackPanel 做到这一点 - 网格也可以,但还有更多设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多