【问题标题】:Best WPF panel to create custom control创建自定义控件的最佳 WPF 面板
【发布时间】:2015-06-13 07:25:40
【问题描述】:

我正在尝试设计一个包含一个富文本框和一个复选框的自定义控件。我需要在运行时在堆栈面板中添加此控件。由于堆栈面板的大小可以更改,我想确保自定义控件占用全部空间,并且控件内的文本框的大小相应增加。

我有点困惑,哪个面板最适合这个自定义控件。我应该选择画布还是停靠面板,甚至是网格?

欢迎提出任何建议。

编辑
以下是主页的完整代码。它包含两个部分,一个用于报告预览,另一个用于报告编辑。该报告编辑部分将计算子报告总数并创建那么多部分。因此,报表编辑窗格需要很好地堆叠控件,并上下移动其他控件以适应子报表的扩展。子报表本身的大小可能会有所不同。

Telerik 的 radExpander 起初看起来是个好主意,但主 StackPanel 并没有考虑 radExpander 的可见性状态。现在,即使 radExpander 最小化,StackPanel 也会使用全高。

    <ScrollViewer Grid.Row="1" Panel.ZIndex="5">
        <Grid x:Name="MainArea" VerticalAlignment="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"/>
                <ColumnDefinition Width="1*"/>
            </Grid.ColumnDefinitions>
            <StackPanel CanVerticallyScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto">
                <telerik:RadExpander x:Name="ReportSection" Height="120" Margin="10,10,10,10" VerticalAlignment="Top" FontFamily="Trebuchet MS" Foreground="#FF0081A7" Header="Report Section Name" BorderBrush="#FF0081A7" BorderThickness="1"> 
                    <telerik:RadExpander.Content>
                        <StackPanel>
                            <CheckBox x:Name="AddToReport" Content="ADD TO REPORT" HorizontalAlignment="Left" VerticalAlignment="Top" Width="150" Height="30" VerticalContentAlignment="Center" BorderBrush="#FF0081A7" Foreground="#FF0081A7" IsChecked="True" FontFamily="Trebuchet MS" />
                            <telerik:RadRichTextBox x:Name="radRichTextBox" DocumentInheritsDefaultStyleSettings="True" Height="auto" HorizontalScrollBarVisibility="Hidden" IsSelectionMiniToolBarEnabled="True" IsSpellCheckingEnabled="True" IsContextMenuEnabled="True" Margin="10" VerticalScrollBarVisibility="Auto" Width="Auto"/>
                        </StackPanel>
                    </telerik:RadExpander.Content>
                </telerik:RadExpander>
                <telerik:RadExpander x:Name="ReportSection2" Height="120" Margin="10,10,10,10" VerticalAlignment="Top" FontFamily="Trebuchet MS" Foreground="#FF0081A7" Header="Report Section Name" BorderBrush="#FF0081A7" BorderThickness="1" VerticalContentAlignment="Top" HorizontalContentAlignment="Left" RenderTransformOrigin="0.493,0.856">
                    <telerik:RadExpander.Content>
                        <StackPanel>
                            <CheckBox x:Name="AddToReport2" Content="ADD TO REPORT" HorizontalAlignment="Left" VerticalAlignment="Top" Width="150" Height="30" VerticalContentAlignment="Center" BorderBrush="#FF0081A7" Foreground="#FF0081A7" IsChecked="True" FontFamily="Trebuchet MS" />
                            <telerik:RadRichTextBox x:Name="radRichTextBox2" DocumentInheritsDefaultStyleSettings="True" Height="auto" HorizontalScrollBarVisibility="Hidden" IsSelectionMiniToolBarEnabled="True" IsSpellCheckingEnabled="True" IsContextMenuEnabled="True" Margin="10" VerticalScrollBarVisibility="Auto" Width="Auto"/>
                        </StackPanel>
                    </telerik:RadExpander.Content>
                </telerik:RadExpander>
                <telerik:RadExpander x:Name="ReportSection3" Height="120" Margin="10,10,10,10" VerticalAlignment="Top" FontFamily="Trebuchet MS" Foreground="#FF0081A7" Header="Report Section Name" BorderBrush="#FF0081A7" BorderThickness="1">
                    <telerik:RadExpander.Content>
                        <StackPanel>
                            <CheckBox x:Name="AddToReport3" Content="ADD TO REPORT" HorizontalAlignment="Left" VerticalAlignment="Top" Width="150" Height="30" VerticalContentAlignment="Center" BorderBrush="#FF0081A7" Foreground="#FF0081A7" IsChecked="True" FontFamily="Trebuchet MS" />
                            <telerik:RadRichTextBox x:Name="radRichTextBox3" DocumentInheritsDefaultStyleSettings="True" Height="auto" HorizontalScrollBarVisibility="Hidden" IsSelectionMiniToolBarEnabled="True" IsSpellCheckingEnabled="True" IsContextMenuEnabled="True" Margin="10" VerticalScrollBarVisibility="Auto" Width="Auto"/>
                        </StackPanel>
                    </telerik:RadExpander.Content>
                </telerik:RadExpander>
                <telerik:RadExpander x:Name="ReportSection4" Height="120" Margin="10,10,10,10" VerticalAlignment="Top" FontFamily="Trebuchet MS" Foreground="#FF0081A7" Header="Report Section Name" BorderBrush="#FF0081A7" BorderThickness="1">
                    <telerik:RadExpander.Content>
                        <StackPanel>
                            <CheckBox x:Name="AddToReport4" Content="ADD TO REPORT" HorizontalAlignment="Left" VerticalAlignment="Top" Width="150" Height="30" VerticalContentAlignment="Center" BorderBrush="#FF0081A7" Foreground="#FF0081A7" IsChecked="True" FontFamily="Trebuchet MS" />
                            <telerik:RadRichTextBox x:Name="radRichTextBox4" DocumentInheritsDefaultStyleSettings="True" Height="auto" HorizontalScrollBarVisibility="Hidden" IsSelectionMiniToolBarEnabled="True" IsSpellCheckingEnabled="True" IsContextMenuEnabled="True" Margin="10" VerticalScrollBarVisibility="Auto" Width="Auto"/>
                        </StackPanel>
                    </telerik:RadExpander.Content>
                </telerik:RadExpander>
            </StackPanel>
        </Grid>
    </ScrollViewer>

【问题讨论】:

  • 您尝试过任何方法吗?两个面板都不比另一个更好,这完全取决于您使用该面板所需的上下文。试验一下,看看什么对你有用。
  • 我都试过了。两者都有自己的问题。我倾向于画布,但不确定这是否会给我最好的表现。
  • 如果您希望控件动态调整大小,我会避免使用 Canvas。您从网格控件开始遇到什么问题?并且要明确一点:您是在创建自定义控件还是用户控件?
  • 就我个人而言,在这种情况下我不会使用 Canvas,您能否提供一些代码以便我帮助您进行布局?
  • Canvas 绝对不是这里的答案,因为它没有重新定位和调整大小。该操作表示他想要调整大小,因此可以将画布从列表中排除。

标签: c# wpf


【解决方案1】:

编辑前已回答
根据您的解释,您只能从列表中排除画布。 其他的具有调整其中子控件的大小和重新定位功能。 甚至可以通过配置一个面板(例如网格)来获得相同的行为,以与另一个面板(如停靠面板)具有相同的效果。 网格面板可能是最通用的,但即便如此,每个面板都有其用途。这个想法应该是使用正确的面板来完成这项工作,以便 xaml 的数量受到限制且可读。

可以在此处找到有关容器的更多信息: http://www.wpf-tutorial.com/panels/introduction-to-wpf-panels/

您没有针对某个定位提出具体问题,因此答案也只能触及表面。但是,如果您在 WPF 面板和布局方面进行谷歌搜索并花一些时间阅读材料并做一些练习,我相信您会在几个小时内理解它们。

【讨论】:

  • 不需要定位本身。我可以按不同的顺序放置控件。想法是将报告的部分保留在富文本框中,并可选择从报告中添加或删除部分。所以,我想显示两个窗格,一个带有报告的预览,另一个是所有部分都可编辑的。目前我正在尝试使用网格来简单地将控件放在不同的行中。
  • 另外,我在主页中添加了我到目前为止所做的 XAML。目前它运行良好,但有一点警告。我的堆栈面板会考虑 radExpander 控件的整个高度,即使它被最小化也是如此。
猜你喜欢
  • 2011-05-15
  • 2011-04-19
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多