2013-09-28 6 views
3

Я создаю пользовательский элемент управления размером 300x100, я бы хотел, чтобы это было разрешение на экране 1024x768, но на экране 2048x1536 мне бы хотелось, чтобы это было 600x200, в общем, я хотел бы установите его размер пропорционально разности высот (так что если экран будет в два раза выше, то управление будет в два раза выше и вдвое больше).Установите ширину/высоту для пропорциональности в xaml?

Любые идеи, как я могу достичь этого, не прибегая к коду (я готов, если не будет другого выбора)?

+0

хороший quesion, вы знаете, любой API, который revils текущий resoulotion? –

+0

Посмотрите на нижний ответ http://stackoverflow.com/questions/5082610/get-and-set-screen-resolution –

+0

@meds, хорошо ли я понимаю, что независимо от вашего текущего размера окна вы хотите, чтобы размер регулятора пропорционален разрешению экрана? – dkozl

ответ

2

Вы можете решить это без кода, создав прокси-контроль. Люди часто используют этот подход для правильного обновления свойств ActualWidth и ActualHeight, с которыми они могут связываться, как в ответе на this question.

В вашем случае вы хотите привязать элемент элемента управления прокси к некоторому элементу, который растягивается до полного размера окна. Когда изменяется ширина или высота связанного элемента, вы можете установить значение двух свойств в вашем прокси-контроле как вычисленную пропорциональную высоту и ширину. Затем вы можете просто привязать эти пропорциональные размеры к ширине и высоте вашего пользовательского элемента управления.

Например:

public class ProportionalSizeHelper : FrameworkElement, INotifyPropertyChanged 
{ 
    private double _proportionalWidth = 0; 
    private double _proportionalHeight = 0; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public FrameworkElement Element 
    { 
     get { return (FrameworkElement)GetValue(ElementProperty); } 
     set { SetValue(ElementProperty, value); } 
    } 

    public double ProportionalHeight 
    { 
     get{ return _proportionalHeight; } 
    } 

    public double ProportionalWidth 
    { 
     get { return _proportionalWidth; } 
    } 

    public static readonly DependencyProperty ElementProperty = 
     DependencyProperty.Register("Element", typeof(FrameworkElement), typeof(ProportionalSizeHelper), 
            new PropertyMetadata(null,OnElementPropertyChanged)); 

    private static void OnElementPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((ProportionalSizeHelper)d).OnElementChanged(e); 
    } 

    private void OnElementChanged(DependencyPropertyChangedEventArgs e) 
    { 
     FrameworkElement oldElement = (FrameworkElement)e.OldValue; 
     FrameworkElement newElement = (FrameworkElement)e.NewValue; 

     if (newElement != null) 
     { 
      newElement.SizeChanged += new SizeChangedEventHandler(Element_SizeChanged); 
     } 
     else 
     { 
      _proportionalHeight = 0; 
      _proportionalWidth = 0; 
     } 
     if (oldElement != null) 
     { 
      oldElement.SizeChanged -= new SizeChangedEventHandler(Element_SizeChanged); 
     } 
     NotifyPropChange(); 
    } 

    private void Element_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     // This can be whatever calculation you need 
     double factor = Math.Min(Element.ActualWidth/1024, Element.ActualHeight/768); 
     _proportionalHeight = 100*factor; 
     _proportionalWidth = 300*factor; 
     NotifyPropChange(); 
    } 

    private void NotifyPropChange() 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("ProportionalWidth".NonNls())); 
      PropertyChanged(this, new PropertyChangedEventArgs("ProportionalHeight".NonNls())); 
     } 
    } 
} 

Тогда в XAML, с UserControl изменено на то, что вам нужно:

<Grid x:Name="LayoutRoot"> 
    <Grid.Resources> 
     <c:ProportionalSizeHelper Element="{Binding ElementName=LayoutRoot}" x:Name="proxy" /> 
    </Grid.Resources> 
    <UserControl Width="{Binding ProportionalWidth, ElementName=proxy}" Height={Binding ProportionalHeight, ElementName=proxy} /> 
</Grid> 
1

Это код Silverlight. Вот как получить высоту и ширину экрана

public MainPage() 
    { 
     InitializeComponent(); 
     Loaded += new RoutedEventHandler(MainPage_Loaded); 
    } 
    void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     int Width = HtmlPage.Window.Eval("screen.width"); 
     int Height = HtmlPage.Window.Eval("screen.height"); 

//Now here increase the height and width of control 
double factor = Width/1024; // this is your default you asked for 
gdTestElement.Width = 300*factor; 
gdTestElement.Height = 100*factor; 

     } 

:) Попробуйте и дайте мне знать

Смежные вопросы