1

独自のナビゲーション ウィンドウを作成したアプリケーションがあり (さまざまな理由により)、コンテンツは境界線内でホストされています。コンテンツを入れ替えるとき、ウィンドウ全体のサイズを自動的に変更できるように、コンテンツがレンダリングされるとすぐに通知するメカニズムが必要です。

ウィンドウのサイズをコンテンツまたは特定の最大サイズに変更する動作が必要です。自動サイズ変更が行われた後、ウィンドウはユーザーが何らかの方法でサイズ変更できる必要があります。

私は使っている:

this.MaxHeight = 700;
this.MaxWidth = 800;
this.SizeToContent = System.Windows.SizeToContent.WidthAndHeight;
this.SizeToContent = System.Windows.SizeToContent.Manual;
this.MaxWidth = double.PositiveInfinity;
this.MaxHeight = double.PositiveInfinity;

ただし、レンダリングは常に終了しているとは限らないため、これが常に機能するとは限りません。

編集:レンダリングされたコンテンツが一度だけ起動されることを示すために、このサンプルを書きました:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Width="525"
        Height="350"
        ContentRendered="Window_ContentRendered">
    <StackPanel>
        <Border x:Name="border"
                Width="200"
                Height="200"
                BorderBrush="Cornsilk"
                BorderThickness="1">
            <Ellipse Width="40"
                     Height="20"
                     Fill="AliceBlue"
                     Stroke="Black" />
        </Border>
        <Button x:Name="btn"
                Click="btn_Click"
                Content="ClickMe" />
        <TextBlock x:Name="txtRender" />
    </StackPanel>
</Window>

コードビハインド:

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        int rendercount = 0;
        Random rnd = new Random();

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_ContentRendered(object sender, EventArgs e)
        {
            rendercount++;
            txtRender.Text = rendercount.ToString();
        }

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            Ellipse ell = new Ellipse();
            ell.Width = rnd.Next(50, 100);
            ell.Height = rnd.Next(10, 100);
            ell.Stroke = Brushes.Black;
            ell.StrokeThickness = 2;
            border.Child = ell;
        }
    }
}
4

1 に答える 1

0

境界線のサイズを削除し、this.SizeToContent = System.Windows.SizeToContent.WidthAndHeight;後でのみ設定しますInitializeComponent();

作業中の XAML:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        ContentRendered="Window_ContentRendered">
    <StackPanel>
        <Border x:Name="border"
                BorderBrush="Cornsilk"
                BorderThickness="1">
            <Ellipse Width="40"
                     Height="20"
                     Fill="AliceBlue"
                     Stroke="Black" />
        </Border>
        <Button x:Name="btn"
                Click="btn_Click"
                Content="ClickMe" />
        <TextBlock x:Name="txtRender" />
    </StackPanel>
</Window>

そしてコードビハインド

public partial class MainWindow : Window
{
    int rendercount = 0;
    Random rnd = new Random();

    public MainWindow()
    {
        InitializeComponent();

        this.SizeToContent = System.Windows.SizeToContent.WidthAndHeight;
    }

    private void Window_ContentRendered(object sender, EventArgs e)
    {
        rendercount++;
        txtRender.Text = rendercount.ToString();
    }

    private void btn_Click(object sender, RoutedEventArgs e)
    {
        Ellipse ell = new Ellipse();
        ell.Width = rnd.Next(50, 100);
        ell.Height = rnd.Next(10, 100);
        ell.Stroke = Brushes.Black;
        ell.StrokeThickness = 2;
        border.Child = ell;
    }
}
于 2012-08-15T11:32:57.790 に答える