2011-11-14 71 views
13

我有一個WPF應用程序與每個窗口上的多個控件,一些覆蓋等,我需要的是一種讓應用程序根據屏幕分辨率自動調整自己的方式。調整WPF窗口和內容依賴於屏幕分辨率

任何想法?

+0

爲什麼你需要這個?如果你想簡單地調整窗口大小,@Fischermaen給了你答案。但是如果你想改變字體的大小等,這是不需要的,因爲WPF已經管理這個。所有WPF渲染都在虛擬座標中工作,虛擬座標根據系統的DPI設置映射到物理像素。 –

+0

你想讓你的窗戶的尺寸與其內容要求的尺寸完全相同嗎?然後閱讀這個類似的[問題](http://stackoverflow.com/questions/1746431/wpf-control-size-to-content)。 – dowhilefor

+1

但我的wpf有座標集和字體大小設置等基本上軟件需要適用於不同的分辨率 –

回答

19

只需簡單地作出這樣一個結合:

<Window x:Class="YourApplication.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="YourApplication" 
    Height="{Binding SystemParameters.PrimaryScreenHeight}" 
    Width="{Binding SystemParameters.PrimaryScreenWidth}"> 
+0

這會調整窗體上的所有控件的大小嗎? –

+0

這取決於你如何設計你的表單。您可以擁有修復設計,或者控件將相對於其容器調整大小。 – Fischermaen

+0

哦有趣,我希望我知道,當我開始時,哦,好生病給它一個空白項目的測試,看看會發生什麼。所以爲了澄清,需要使控制項目的寬度和高度相對?我有這個 ,我將如何使這個窗口調整大小? –

42

語法身高=「{結合SystemParameters.PrimaryScreenHeight}」提供的線索,但這樣是行不通的。 SystemParameters.PrimaryScreenHeight是靜態的,因此你應當使用:

<Window x:Class="MyApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:tools="clr-namespace:MyApp.Tools" 
     Height="{x:Static SystemParameters.PrimaryScreenHeight}" 
     Width="{x:Static SystemParameters.PrimaryScreenWidth}" 
     Title="{Binding Path=DisplayName}" 
     WindowStartupLocation="CenterScreen" 
     Icon="icon.ico" 
    > 

它會適合整個屏幕。然而,您可能更喜歡適合屏幕尺寸的百分比,例如, 90%,在這種情況下,語法必須與轉換器中具有約束力的規範進行修改:

<Window x:Class="MyApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:tools="clr-namespace:MyApp.Tools" 
     Height="{Binding Source={x:Static SystemParameters.PrimaryScreenHeight}, Converter={tools:RatioConverter}, ConverterParameter='0.9' }" 
     Width="{Binding Source={x:Static SystemParameters.PrimaryScreenWidth}, Converter={tools:RatioConverter}, ConverterParameter='0.9' }" 
     Title="{Binding Path=DisplayName}" 
     WindowStartupLocation="CenterScreen" 
     Icon="icon.ico" 
    > 

凡RatioConverter在這裏提出MyApp.Tools命名空間中聲明如下:

namespace MyApp.Tools { 

    [ValueConversion(typeof(string), typeof(string))] 
    public class RatioConverter : MarkupExtension, IValueConverter 
    { 
     private static RatioConverter _instance; 

     public RatioConverter() { } 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { // do not let the culture default to local to prevent variable outcome re decimal syntax 
     double size = System.Convert.ToDouble(value) * System.Convert.ToDouble(parameter,CultureInfo.InvariantCulture); 
     return size.ToString("G0", CultureInfo.InvariantCulture); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { // read only converter... 
     throw new NotImplementedException(); 
     } 

     public override object ProvideValue(IServiceProvider serviceProvider) 
     { 
     return _instance ?? (_instance = new RatioConverter()); 
     } 

    } 
} 

凡的定義轉換器應從MarkupExtension繼承,以便直接在根元素中使用,而不需要以前的聲明作爲資源。

+2

希望我能upvote不止一次。 – phonetagger

+0

如何以編程方式設置'Height =「{Binding Source = {x:Static SystemParameters.PrimaryScreenHeight},Converter = {tools:RatioConverter},ConverterParameter ='0.9'}」 Width =「{Binding Source = {x:Static SystemParameters.PrimaryScreenWidth},Converter = {tools:RatioConverter},ConverterParameter ='0。9'}「' –

+0

我同意phonetagger這是一個很好的答案,只需使它適合屏幕尺寸的一個百分比,這樣無論分辨率/顯示器尺寸如何,它都會始終適合... – AndyUK