Silverlight 4 как определить размер экрана и привязать к сетке - PullRequest
1 голос
/ 28 марта 2011

Я не могу заставить свое приложение правильно изменить размер экрана.вот мой xaml

<Grid x:Name="LayoutRoot"
      Background="White"
      DataContext="{Binding Source={StaticResource ViewModel}}"
      MinHeight="473"
      MinWidth="1200"
      MaxHeight="600"
      MaxWidth="1366">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="SizeChanged">
        <ei:CallMethodAction MethodName="WndSizeChanged"
                             TargetObject="{Binding}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

    <Grid.ColumnDefinitions>
        <ColumnDefinition  Width="300*" />
        <ColumnDefinition  Width="189*" />
        <ColumnDefinition  Width="720*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition  Height="101*" />
        <RowDefinition  Height="372*" />
    </Grid.RowDefinitions>

 <sdk:DataGrid Grid.Row="1"
                  Grid.Column="0"
                  Grid.ColumnSpan="3"
                  AutoGenerateColumns="False"
                  HorizontalAlignment="Left"
                  Height="Auto"
                  Width="Auto"
                  Name="dataGrid_Columns"
                  VerticalAlignment="Top"
                  ItemsSource="{Binding Path=LstDetails}"
                  RowDetailsVisibilityMode="VisibleWhenSelected"
                  IsReadOnly="True"
                  HeadersVisibility="All"
                  HorizontalScrollBarVisibility="Visible"
                  VerticalScrollBarVisibility="Visible"
                  CanUserReorderColumns="True"
                  CanUserResizeColumns="True"
                  CanUserSortColumns="True">

       .....more code nested in here.......
   </sdk:DataGrid>

Я пытался поставить авто на пользовательский элемент управления, а также в сетке, ничего не работает.Если я вычеркну эти минимальные и максимальные значения, то они исчезнут со страницы.Это событие, которое я поставил там, происходит только после того, как вы измените его размер.Я бы предположил, потому что это пользовательский элемент управления внутри оболочки.Я использую призму.Я нашел пример определения высоты и ширины, но изначально он не работает.Когда я связываю высоту и ширину с двойными свойствами, событие вообще не запускается.У меня заканчиваются идеи.Я нашел способы вставить код за фактическую ширину и высоту.Я действительно хочу избежать кода позади, но даже это не сработало.Я знаю, что проблема связана с сеткой данных, потому что она динамическая и будет расти или уменьшаться в зависимости от фильтров.Любая помощь очень ценится.Спасибо.

1 Ответ

2 голосов
/ 28 марта 2011

Это лучшее решение, которое я могу придумать. Это работает, но, вероятно, не очень хорошо, поскольку виртуальная машина теперь кое-что знает о View (поправьте меня, если я ошибаюсь). так вот моя ВМ:

    public void WndSizeChanged(object sender, EventArgs e)
    {
        this.setHeightWidth();
    }
    private void setHeightWidth()
    {
        this.WindowHeight = (Application.Current.RootVisual as FrameworkElement).ActualHeight - 125;
        this.WindowWidth = (Application.Current.RootVisual as FrameworkElement).ActualWidth - 108;
    }

    public double WindowHeight{get;set;}

    public double WindowWidth{get;set;}

и на мой взгляд:

<Grid x:Name="LayoutRoot"
      Background="White"
      DataContext="{Binding Source={StaticResource ViewModel}}"
      Height="{Binding Path=WindowHeight, Mode=TwoWay}"
      Width="{Binding Path=WindowWidth, Mode=TwoWay}">

        <i:Interaction.Triggers>
        <i:EventTrigger EventName="LayoutUpdated">
                <ei:CallMethodAction MethodName="WndSizeChanged"
                                     TargetObject="{Binding}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

        <Grid.ColumnDefinitions>
            <ColumnDefinition  Width="300*" />
            <ColumnDefinition  Width="189*" />
            <ColumnDefinition  Width="720*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition  Height="101*" />
            <RowDefinition  Height="372*" />
        </Grid.RowDefinitions>

В основном изменилось событие, которое вызывается для LayoutUpdated. Работает как шарм. Я на временной шкале, так что это придется делать. Я надеюсь, что это поможет любому, кто находится в такой же ситуации, как я. Не забудьте вызвать setHeightWidth () в конструкторе, чтобы также изначально установить h и w.

...