Why size of controls are wrong before resize? [WPF]

[亡魂溺海] 提交于 2020-01-25 04:14:46

问题


Current custom window(base) is:

<Window x:Class="Views.DialogWindow"
        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:Views"
        xmlns:dialog="clr-namespace:ViewModels"
        mc:Ignorable="d"
        Title="DialogWindow" Height="450" Width="800" WindowStartupLocation="CenterScreen" WindowStyle="None" AllowsTransparency="True" Background="Transparent" ResizeMode="CanResizeWithGrip" SizeToContent="WidthAndHeight">
    <Window.Resources>
        <ResourceDictionary>
            <DataTemplate DataType="{x:Type dialog:Dialog_1ViewModel}">
                <local:Dialog_1></local:Dialog_1>
            </DataTemplate>
        </ResourceDictionary>
    </Window.Resources>
    <ContentPresenter x:Name="ContentPresenter" Content="{Binding}"></ContentPresenter>
</Window>

Window in designer:

Its DataContext is set to an instance of UserControl:

<UserControl x:Class="Views.Dialog_1"
             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:Views"
             xmlns:t1="clr-namespace:Windows"
             mc:Ignorable="d" d:DesignHeight="400" d:DesignWidth="600">
    <UserControl.Resources>
        <ResourceDictionary>
            <Style TargetType="TextBlock">
                <Setter Property="TextTrimming" Value="CharacterEllipsis"></Setter>
            </Style>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Resources/Resource_1.xaml"></ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <Border CornerRadius="4" Background="#ffff" BorderThickness="1" BorderBrush="#9888">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="2*"></RowDefinition>
                <RowDefinition Height="12*"/>
                <RowDefinition Height="15*"></RowDefinition>
                <RowDefinition Height="40"></RowDefinition>
            </Grid.RowDefinitions>
            <Border Grid.Row="0" BorderThickness="0,0,0,1" BorderBrush="#f999" Cursor="Hand" MouseDown="Border_MouseDown">
                <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Header"></TextBlock>
            </Border>
            <Grid Grid.Row="1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*" MinWidth="150"></ColumnDefinition>
                    <ColumnDefinition Width="3*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid Grid.Column="0" Margin="4">
                    <Image Source="C:\test.png"></Image>
                </Grid>
                <Grid Grid.Column="1" Margin="4">
                    <Grid.RowDefinitions>
                        <RowDefinition></RowDefinition>
                        <RowDefinition Height="20"/>
                    </Grid.RowDefinitions>
                    <StackPanel Grid.Row="0">
                        <DockPanel>
                            <TextBlock Text="Foo: " FontWeight="Bold" Margin="0,0,4,0"></TextBlock>
                            <TextBlock Text="Bar"></TextBlock>
                        </DockPanel>
                        <DockPanel Margin="0,8,0,0">
                            <TextBlock Text="Foo: " FontWeight="Bold" Margin="0,0,4,0"></TextBlock>
                            <TextBlock Text="Bar"></TextBlock>
                        </DockPanel>
                        <DockPanel>
                            <TextBlock Text="Foo: " FontWeight="Bold" Margin="0,0,4,0"></TextBlock>
                            <TextBlock Text="Bar"></TextBlock>
                        </DockPanel>
                        <DockPanel>
                            <TextBlock Text="Foo: " FontWeight="Bold" Margin="0,0,4,0"></TextBlock>
                            <TextBlock Text="Bar"></TextBlock>
                        </DockPanel>
                    </StackPanel>
                    <DockPanel Grid.Row="1" VerticalAlignment="Center">
                        <TextBlock Text="Foo: " FontWeight="Bold" Margin="0,0,4,0"/>
                        <TextBlock Text="Bar"/>
                    </DockPanel>
                </Grid>
            </Grid>
            <DataGrid Grid.Row="2" Background="#ff88" ColumnWidth="Auto" VerticalAlignment="Stretch" AutoGenerateColumns="False" ItemsSource="{Binding data_1}">
                <DataGridTextColumn Header="Name" MinWidth="200" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Description" MinWidth="100" Binding="{Binding Description}"/>
            </DataGrid>
            <Border Grid.Row="3" BorderThickness="0,1,0,0" BorderBrush="#f999">
                <Grid HorizontalAlignment="Right" Margin="4">
                    <Button Style="{StaticResource T_button_1}" HorizontalAlignment="Right" VerticalAlignment="Center" Width="100" Command="{Binding C_No}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}" t1:Button_1.Icon="/Icons/no.png" t1:Button_1.Label="Cancel"/>
                    <Button Style="{StaticResource T_button_1}" HorizontalAlignment="Right" VerticalAlignment="Center" Width="100" Command="{Binding C_Yes}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}" Margin="0,0,105,0"/>
                </Grid>
            </Border>
        </Grid>
    </Border>
</UserControl>

UserControl in designer:

The result(run and resize process):

Close look shows interesting behaviour(seems like style changes):


Edit 1


Made some more minimized version:

<UserControl x:Class="Views.Dialog_1"
             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"
             mc:Ignorable="d" d:DesignHeight="400" d:DesignWidth="600">
    <UserControl.Resources>
        <ResourceDictionary>
            <Style TargetType="TextBlock">
                <Setter Property="TextTrimming" Value="CharacterEllipsis"></Setter>
            </Style>
            <Style TargetType="Grid">
                <Setter Property="ShowGridLines" Value="True"></Setter>
            </Style>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Resources/Resource_1.xaml"></ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <Border Background="#ffff" BorderThickness="1" BorderBrush="#ccc">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="20"></RowDefinition>
                <RowDefinition Height="2*"/>
                <RowDefinition Height="3*"></RowDefinition>
                <RowDefinition Height="40"></RowDefinition>
            </Grid.RowDefinitions>
            <Border Grid.Row="0">
            </Border>
            <Grid Grid.Row="1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"></ColumnDefinition>
                    <ColumnDefinition Width="3*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid Grid.Column="0" Margin="4">
                    <Image Source="C:\test.ico"></Image>
                </Grid>
                <Grid Grid.Column="1" Margin="4">
                </Grid>
            </Grid>
            <Grid Grid.Row="2">
            </Grid>
            <Border Grid.Row="3">
            </Border>
        </Grid>
    </Border>
</UserControl>

When run:

What could cause such issue where controls' initial sizes are oddly wrong and after resizing they return to "normal" or how would it be possible to fix/escape that situation leaving similar logic with custom UserControl of Window?

May this be caused by ContentPresenter part?

来源:https://stackoverflow.com/questions/58998542/why-size-of-controls-are-wrong-before-resize-wpf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!