最好的WPF面板来创建自定义控件

时间:2015-06-13 07:25:40

标签: c# wpf

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

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

欢迎提出任何建议。

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

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>

1 个答案:

答案 0 :(得分:0)

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

有关容器的更多信息,请访问: http://www.wpf-tutorial.com/panels/introduction-to-wpf-panels/

你没有给出某个定位的具体问题,所以答案也只能划伤表面。但是如果你围绕WPF面板和布局进行谷歌搜索,并花一些时间阅读材料并做一些练习,我相信你会在几个小时内理解它们。