Вы можете решить это без кода, создав прокси-контроль. Люди часто используют этот подход для правильного обновления свойств 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>
хороший quesion, вы знаете, любой API, который revils текущий resoulotion? –
Посмотрите на нижний ответ http://stackoverflow.com/questions/5082610/get-and-set-screen-resolution –
@meds, хорошо ли я понимаю, что независимо от вашего текущего размера окна вы хотите, чтобы размер регулятора пропорционален разрешению экрана? – dkozl