2011-03-28 62 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。