我有一個帶有內置選項卡控件的窗口,其中包含每個選項卡中不同大小的控件。我在我的窗口中使用SizeToContent =「WidthAndHeight」,但我想允許它只放大窗口大小。例如,如果我移動到「更大」選項卡,我希望我的控件自動調整其大小,但如果我然後返回到「更小」選項卡,我不希望我的控件減少其大小大小再次。我寧願不使用MinWidth和MinHeight,因爲我希望我的用戶能夠手動減小窗口大小。允許SizeToContent放大但不縮小它
謝謝
我有一個帶有內置選項卡控件的窗口,其中包含每個選項卡中不同大小的控件。我在我的窗口中使用SizeToContent =「WidthAndHeight」,但我想允許它只放大窗口大小。例如,如果我移動到「更大」選項卡,我希望我的控件自動調整其大小,但如果我然後返回到「更小」選項卡,我不希望我的控件減少其大小大小再次。我寧願不使用MinWidth和MinHeight,因爲我希望我的用戶能夠手動減小窗口大小。允許SizeToContent放大但不縮小它
謝謝
這是一個工作示例;
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;
}
}
}
我知道這是一個有點難看,但它是更好的,沒有什麼:)
感謝你的答案。這個解決方案並沒有那麼糟糕,但我想等待看看是否有一種「更清潔」的方法。我不喜歡,特別是,必須檢查當前標籤更改的時間,因爲在尺寸應該改變時(例如當前標籤的內容增加其大小時)可能存在其他情況。此外,我所有的控件都將「高度」和「寬度」設置爲「自動」,因此我不認爲使用「寬度」和「高度」屬性有效。我想我必須使用ActualWidth和ActualHeight –
這可以給你一個想法:您應該處理寬度和高度屬性更改的事件。如果他們將變得更大,請設置SizeToContent =「WidthAndHeight」,否則,應該嘗試阻止這種情況的發生。 – Ramin
@Ramin謝謝你的建議。我認爲SizeToContent應該是WidthAndHeight,不是嗎?無論如何,攔截變化可能會奏效,但是我認爲我必須將寬度和/或高度設置爲舊值,並且AFAIK,SizeToContent不適用於固定的高度/寬度 –
我的意思是,如果大小正在變大要小一些,您應該將SizeToContent設置爲手動,然後保留以前的大小。如果大小將變得更大,請將SizeToContent設置爲WidthAndHeight。如果出現PropertyChanging事件,我認爲它是筆直的(設置SizeToContent = Manual和取消寬度和高度變化,當它變小時),但我認爲沒有事件發生。所以,你可以處理Width和Height改變的事件。如果它們變大,只需設置SizeToContent = WidthAndHeight。如果它們變小了,請設置SizeToContent = Manual並將Height和Width設置爲較大的那個。 – Ramin