2011-03-28 67 views
1

我无法让我的应用程序正确调整屏幕大小。这里是我的xamlSilverlight 4如何检测屏幕大小并绑定到网格

<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> 

我已经尝试把汽车的用户控件,也在网格中,没有任何工作。如果我拿出最小和最大值,那么它就会离开页面。我放在那里的事件只有在你调整大小后才会触发。我会假设,因为这是一个shell内的用户控件。我正在使用棱镜。我找到了一个检测高度和宽度的例子,但它最初并不起作用。当我将高度和宽度绑定到双重属性时,事件根本不会触发。我正在用尽想法。我已经找到了将代码放在实际宽度和高度后面的方法。我真的想避免背后的代码,但即使这样也行不通。我知道问题与数据网格有关,因为这是动态的,并且会根据过滤器增长或缩小。任何帮助是极大的赞赏。谢谢。

+0

你已经设置AutoGenerateColumns =“false”,并没有添加任何列到datagrid然后它将如何工作 – Hukam 2011-03-28 15:18:41

+0

我没有把我所有的标记,因为这会有点太多。我拥有所有这一切。数据显示时,我把固定的宽度和高度,但当我不这样扩展到3000+的高度。当它完成加载数据时,我使用弹出窗口进行了检查。 – pqsk 2011-03-28 15:22:02

回答

2

这是我能想出的最佳解决方案。它的工作原理,但可能不是很好,因为虚拟机现在知道一些关于视图(纠正我,如果我错了)。所以这里是我的VM:

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。