将USERCONTROL扩展到网格插图下方



我有一个具有简单LogView的应用程序。从程序收集到该日志,并滚动日志,因此用户总是可以看到最后一条消息。在ApplicationMainView中,有一个网格,几行和两个行之间的网格插图。日志位于屏幕的底部,网格插图器位于日志上方(用户可以调整日志窗口大小的大小(。

这是一个问题:当应用程序启动并将消息添加到日志窗口中时,网格插图开始移动,日志窗口开始增长。当用户更改带有网格的日志大小时,将消息添加到窗口中,网格插图器不会移动,并且日志窗口仍然保持其大小。这是显示情况的GIF图像。

我应该在哪里更改代码,以便LogView从应用程序开始,用户不必移动GridSplitter?

ApplicationMainView的代码,其中 LogView是:

<Window
    x:Class="UI.ApplicationMainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:UI">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition
                Height="Auto" />
            <RowDefinition
                Height="Auto" />
            <RowDefinition
                Height="*" />
            <RowDefinition
                Height="Auto" />
            <RowDefinition
                Height="Auto" />
        </Grid.RowDefinitions>
        <!-- Other controls removed for simplifaction-->
        <local:FilesView
            Grid.Row="2"
            DataContext="{Binding Files}" />
        <GridSplitter
            Grid.Row="3"
            Height="5"
            ResizeDirection="Rows"
            ResizeBehavior="PreviousAndNext"
            HorizontalAlignment="Stretch"
            VerticalAlignment="Center"
            ShowsPreview="True" />
        <!-- Here is the log -->
        <local:LogView
            Grid.Row="4"
            DataContext="{Binding Log}" />
    </Grid>
</Window>

LogView的代码:

<UserControl
    x:Class="UI.LogView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace: UI">
    <HeaderedContentControl>
        <HeaderedContentControl.Template>
            <ControlTemplate
                TargetType="HeaderedContentControl">
                <DockPanel>
                    <ContentPresenter
                        DockPanel.Dock="Top"
                        ContentSource="Header" />
                    <ContentPresenter />
                </DockPanel>
            </ControlTemplate>
        </HeaderedContentControl.Template>
        <HeaderedContentControl.Header>
            <Border
                Background="Gray"
                CornerRadius="0,20,0,0">
                <Label
                    Content="Log" />
            </Border>
        </HeaderedContentControl.Header>
        <Border
            BorderThickness="2,0,2,2"
            BorderBrush="Gray">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition
                        Height="*" />
                    <RowDefinition
                        Height="Auto" />
                </Grid.RowDefinitions>
                <DataGrid
                    x:Name="LogGrid"
                    Grid.Row="0"
                    AutoGenerateColumns="False"
                    CanUserAddRows="False"
                    IsReadOnly="True"
                    GridLinesVisibility="None"
                    MinHeight="50"
                    ItemsSource="{Binding AllMessages}">
                    <DataGrid.Columns>
                        <DataGridTextColumn
                            Binding="{Binding Time}"
                            CanUserSort="False"
                            CanUserReorder="False"
                            IsReadOnly="True"
                            Header="Time" />
                        <DataGridTextColumn
                            Binding="{Binding Message}"
                            Width="*"
                            CanUserSort="False"
                            CanUserReorder="False"
                            IsReadOnly="True"
                            Header="Message" />
                    </DataGrid.Columns>
                </DataGrid>
                <DockPanel
                    Grid.Row="1"
                    LastChildFill="False">
                    <Button
                        Content="Clear"
                        Command="{Binding ClearLogCommand}" />
                    <Button
                        Content="Copy clipboard"
                        Command="{Binding CopyLogClipboardCommand}" />
                </DockPanel>
            </Grid>
        </Border>
    </HeaderedContentControl>
</UserControl>

LogView背后的代码(用于滚动日志(:

using System.Collections.Specialized;
using System.Windows.Controls;
namespace UI
{
    public partial class LogView : UserControl
    {
        public LogView()
        {
            InitializeComponent();
            ((INotifyCollectionChanged)LogGrid.Items).CollectionChanged += OnLogViewCollectionChanged;
        }
        private void OnLogViewCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (LogGrid.Items.Count > 0)
            {
                LogGrid.ScrollIntoView(LogGrid.Items[LogGrid.Items.Count - 1]);
            }
        }
    }
}

您定义了网格的底数:

<RowDefinition Height="Auto" />

这使logview增长。

您必须将Height定义为固定尺寸

Height="200"

或屏幕的百分比

Height="*"Height="2*"

最新更新