Определение размера содержимого для заполнения «клиентской области» окна - PullRequest
3 голосов
/ 29 июня 2011

У меня возникли проблемы с определением размера элемента управления WPF (в этом примере я буду использовать элемент управления Grid) до размера Client области Window.Я понимаю, что Grid автоматически заполняет все доступное пространство по умолчанию, однако мне нужно, чтобы Grid Width был установлен вручную, чтобы я мог привязаться к нему из другого элемента управления (DataGrid с одним из столбцов *Для 1007 * установлено значение Star, если это имеет какое-либо значение).

Пожалуйста, рассмотрите следующий XAML:

<Window x:Class="TestApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="768" Width="1024"
        x:Name="mainWindow">

    <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto">
        <Grid x:Name="testGrid" Background="DarkGray">
        </Grid>
    </ScrollViewer>

</Window>

и следующий код:

using System.Windows;

namespace TestApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            testGrid.Width = mainWindow.Width - (SystemParameters.BorderWidth * 2);
        }
    }
}

При запуске этого простого приложения ширина Grid немного больше, чем область Client в Window, в результате чего отображается Horizontal Scroll Bar.Если SystemParameters.BorderWidth не точно вычисляет ширину границы Window, что делает?

В соответствии с самой последней документацией MSDN, SystemParameters.BorderWidth: Получает метрику, которая определяет границуширина неклиентской области не минимизированного окна.

Ответы [ 3 ]

5 голосов
/ 29 июня 2011

Вот один из способов привязки размера клиентской ширины без выделенного кода:

<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto">
    <Grid x:Name="testGrid" Background="DarkGray" Width="{Binding Content.ActualWidth, ElementName=mainWindow}">
    </Grid>
</ScrollViewer>

Это использует ваш названный верхний уровень Window и получает с фактической шириной его содержимого,ScrollViewer в этом случае.Если по какой-то причине вы хотите, чтобы содержимое окна отличалось от размера окна, вы можете заключить его в пустой Grid, чтобы этот метод все еще работал.

1 голос
/ 14 июля 2011

После долгого времени, решив эту проблему с размерами, я наконец нашел элегантное решение этой проблемы.Хотя я уже выбрал ответ @Rick Sladkey в качестве ответа (и ответил на мой вопрос, который он сделал), я подумал, что мог бы опубликовать свое обновленное понимание в надежде, что оно может помочь кому-то еще в этом.Дело, оказывается, было в том, чтобы иметь дело с ScrollViewer.Несмотря на то, что размер моего контента до ActualWidth из ScrollViewer работал замечательно, когда его VerticalScrollBar не было видно, все стало ухудшаться, как только мой контент вырос до высоты с вертикальной прокруткой.Хотя я ожидал, что привязка к ActualWidth изменит размер моего контроллера, чтобы он поместился в видимой области ScrollViewer, на самом деле он остался на той же ширине и стал также с горизонтальной прокруткой.Исправление было на самом деле довольно просто.Вместо привязки высоты или ширины элемента управления к ActualHeight или ActualWidth ScrollViewer (соответственно), привязайте высоту или ширину элемента управления к ViewportHeight или ViewportWidth ScrollViewer.

0 голосов
/ 29 июня 2011

Вместо установки ширины вручную, как насчет привязки к свойству ActualWidth сетки (вместо этого вы получите фактическое значение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...