Размер окна WPF не изменяется в зависимости от содержимого ContentPresenter

Есть такое окно WPF,

.
.
.
<Grid>
    <ContentPresenter Content="{Binding CameraCanvas}" Focusable="true" Margin="0" />
</Grid>
</Window>

Я хочу, чтобы размер родительского окна был изменен в соответствии с содержимым ContentPresenter. Контент загружается динамически

SizeToContent и _4 _ / _ 5_ не работали. Любая помощь была бы замечательной.


person Progstar    schedule 19.04.2017    source источник


Ответы (2)


Установка SizeToContent на WidthAndHeight должна работать. Обратите внимание, что для свойства SizeToContent автоматически устанавливается значение Manual, если пользователь изменяет размер окна с помощью ручки изменения размера или перетаскивания границы, поэтому вы, вероятно, также захотите установить для свойства ResizeMode значение NoResize.

См. Следующий пример кода, который устанавливает для свойства Content объекта ContentPresenter значение прямоугольника 500x300 через 3 секунды:

<Window x:Class="WpfApplication1.MainWindow"
        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"
        mc:Ignorable="d"
        Title="MainWindow"
        SizeToContent="WidthAndHeight"
        ResizeMode="NoResize">
    <Grid>
        <ContentPresenter x:Name="cc" Focusable="true" Margin="0">
            <ContentPresenter.Content>
                <TextBlock>test</TextBlock>
            </ContentPresenter.Content>
        </ContentPresenter>
    </Grid>
</Window>

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += async (s, e) => 
        {
            await Task.Delay(3000);
            cc.Content = new Rectangle { Width = 500, Height = 300, Fill = Brushes.Red };
        };
    }
}

Затем размер окна увеличивается, как и ожидалось.

person mm8    schedule 19.04.2017
comment
Спасибо за ваш ответ. Я попробовал, но ничего не вышло. - person Progstar; 19.04.2017
comment
Тогда вы явно делаете что-то не так, потому что это творит чудеса для меня. Что на самом деле не работает? - person mm8; 19.04.2017
comment
Кажется, что окно открыто как пустое содержимое (например, ширина и высота окна равны 0). Но контент точно есть. - person Progstar; 19.04.2017
comment
Я использую следующий код для открытия окна CameraWindow myObject = null; попробуйте {myObject = (CameraWindow) (Activator.CreateInstance (ty)); myObject.DataContext = os; myObject.ShowDialog (); - person Progstar; 19.04.2017
comment
Приспосабливается ли со временем размер окна к размеру содержимого? - person mm8; 19.04.2017
comment
Нет ... ширина окна = 0 высота = 0. Если бы я мог изменить размер окна, я бы увидел, что содержимое там. Проблема в том, что окно не меняет размер в соответствии с этим - person Progstar; 19.04.2017
comment
Значит, вы тогда не устанавливали свойство ResizeMode. Вы хоть пробовали мой пример кода? - person mm8; 19.04.2017
comment
Я действительно так, как ты сказал. Это не сработало. На тот момент я не мог проверить, загружен ли контент или нет. Поэтому я снова попытался изменить свойство ResizeMode. В этот момент я увидел, что контент есть. - person Progstar; 19.04.2017
comment
Вы создали новое окно и вставили мой образец кода? Это не мой код, который не работает. Это твое. Вам следует прочитать это и соответствующим образом изменить свой вопрос: stackoverflow.com/help/mcve - person mm8; 19.04.2017
comment
Ваш код работает. В моем случае я использую Content = {Binding CameraCanvas}. Я думаю, это может быть проблемой. - person Progstar; 19.04.2017

Это довольно поздно, у меня была такая же проблема, и я нашел другое решение -

Используя родительский ContentControl как,

<ContentControl>
    <ContentPresenter .../>
</ContentContro>
person Bandook    schedule 16.05.2020