2012-12-29 75 views
0

我有一個帶有內置選項卡控件的窗口,其中包含每個選項卡中不同大小的控件。我在我的窗口中使用SizeToContent =「WidthAndHeight」,但我想允許它只放大窗口大小。例如,如果我移動到「更大」選項卡,我希望我的控件自動調整其大小,但如果我然後返回到「更小」選項卡,我不希望我的控件減少其大小大小再次。我寧願不使用MinWidth和MinHeight,因爲我希望我的用戶能夠手動減小窗口大小。允許SizeToContent放大但不縮小它

謝謝

+0

這可以給你一個想法:您應該處理寬度和高度屬性更改的事件。如果他們將變得更大,請設置SizeToContent =「WidthAndHeight」,否則,應該嘗試阻止這種情況的發生。 – Ramin

+0

@Ramin謝謝你的建議。我認爲SizeToContent應該是WidthAndHeight,不是嗎?無論如何,攔截變化可能會奏效,但是我認爲我必須將寬度和/或高度設置爲舊值,並且AFAIK,SizeToContent不適用於固定的高度/寬度 –

+0

我的意思是,如果大小正在變大要小一些,您應該將SizeToContent設置爲手動,然後保留以前的大小。如果大小將變得更大,請將SizeToContent設置爲WidthAndHeight。如果出現PropertyChanging事件,我認爲它是筆直的(設置SizeToContent = Manual和取消寬度和高度變化,當它變小時),但我認爲沒有事件發生。所以,你可以處理Width和Height改變的事件。如果它們變大,只需設置SizeToContent = WidthAndHeight。如果它們變小了,請設置SizeToContent = Manual並將Height和Width設置爲較大的那個。 – Ramin

回答

0

這是一個工作示例;

XAML中:

<Window x:Class="WpfApplicationUpper.Window3" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window3" Height="300" Width="300" SizeToContent="WidthAndHeight"> 
<Grid> 
    <TabControl Name="MainTabControl" 
       SelectionChanged="MainTabControl_SelectionChanged" 
       PreviewMouseDown="MainTabControl_PreviewMouseDown"> 
     <TabItem Header="Small Tab" > 
      <Border Background="AliceBlue" Width="200" Height="200" /> 
     </TabItem> 
     <TabItem Header="Medium Tab"> 
      <Border Background="Blue" Width="400" Height="400" /> 
     </TabItem> 
     <TabItem Header="Large Tab"> 
      <Border Background="Navy" Width="600" Height="600" /> 
     </TabItem> 
    </TabControl> 
</Grid> 
</Window> 

背後的代碼:

public partial class Window3 : Window 
    { 
    public Window3() {InitializeComponent();} 
    double _currentWidth; 
    double _currentHeight; 
    private void MainTabControl_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     TabItem currentItem = MainTabControl.SelectedItem as TabItem; 
     FrameworkElement content = currentItem.Content as FrameworkElement; 
     _currentWidth = content.ActualWidth; 
     _currentHeight = content.ActualHeight; 
    } 
    private void MainTabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     TabItem itemAdded = null; 
     TabItem itemRemoved = null; 
     if (e.AddedItems.Count > 0) 
      itemAdded = e.AddedItems[0] as TabItem; 
     if (e.RemovedItems.Count > 0) 
      itemRemoved = e.RemovedItems[0] as TabItem; 

     if (itemAdded != null && itemRemoved != null) 
     { 
      FrameworkElement content = itemAdded.Content as FrameworkElement; 
      double newWidth = content.Width; 
      double newHeight = content.Height; 
      if (newWidth < _currentWidth) 
       content.Width = _currentWidth; 
      if (newHeight < _currentHeight) 
       content.Height = _currentHeight; 
     } 
    } 
} 

我知道這是一個有點難看,但它是更好的,沒有什麼:)

+0

感謝你的答案。這個解決方案並沒有那麼糟糕,但我想等待看看是否有一種「更清潔」的方法。我不喜歡,特別是,必須檢查當前標籤更改的時間,因爲在尺寸應該改變時(例如當前標籤的內容增加其大小時)可能存在其他情況。此外,我所有的控件都將「高度」和「寬度」設置爲「自動」,因此我不認爲使用「寬度」和「高度」屬性有效。我想我必須使用ActualWidth和ActualHeight –