当前位置: 首页 > 编程语言 > C#

开发与分辨率无关的应用程序的技巧

时间:2023-04-10 21:48:21 C#

Tipsondevelopingresolutionindependentapplications宽度属性是一个好习惯吗?我这样做是为了让我的窗口根据可用的工作空间调整大小。constintw=SystemParameters.WorkArea.Width;constinth=SystemParameters.WorkArea.Height;公共厚度OuterGridMargin{得到;}MainViewModel(){OuterGridMargin=newThickness(w/5,h/6,w/5,h/4);XAML:我对一些外部容器执行此操作,以便布局不会在较低分辨率下混乱。目前我正在20英寸的1600x900分辨率(96dpi)下工作。我的应用程序是一个小部件,没有常规窗口。我想知道是否有其他选择。搜索[wpf]resolution]1出现了许多解决类似问题的问题,但我仍然卡住了,无法就如何实现良好的分辨率独立布局得出结论。有两种方法可以在WPF中实现解决方案。一种选择是设计最小分辨率并确保所有内容都正确停靠,以便元素随着窗口分辨率变大而变大。这就是很多人在WinForms中完成的,它仍然可以在WPF中正常工作。您可能已经知道如何通过设置Horizo??ntalAlignment、VerticalAlignment和margin来处理这个问题。您在WPF中所做的更新、更有趣的事情在WinForms中几乎是不可能的,因为您的应用程序实际上只是放大了,所以您的控件会像窗口一样变大。为此,您将在Window中的某个根元素上应用ScaleTransform,并让WPF处理其余部分。这个真的很酷。为了展示它的样子,下面是启动应用程序时窗口的样子,将其变小并变大:http://i.stack.imgur.com/QeoVK.png这是我的代码隐藏制作的一个小示例应用程序:publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();}#regionScaleValue依赖属性publicstaticreadonlyDependencyPropertyScaleValueProperty=DependencyProperty.Register("ScaleValue",typeof(double),typeof(MainWindow),newUIPropertyMetadata(1.0,newPropertyChangedCallback(OnScaleValueChanged),newCoerceValueCallback(OnCoerceScaleValue)));privatestaticobjectOnCoerceScaleValue(DependencyObjecto,objectvalue){MainWindowWmainWindow=indowas)returnmainWindow.OnCoerceScaleValue((double)value);否则返回值;}privatestaticvoidOnScaleValueChanged(DependencyObjecto,DependencyPropertyChangedEventArgse){MainWindowmainWindow=oasMainWindow;e.OldValue,(double)e.NewValue);}受保护virtualdoubleOnCoerceScaleValue(doublevalue){if(double.IsNaN(value))return1.0f;值=Math.Max(0.1,值);返回值;}protectedvirtualvoidOnScaleValueChanged(doubleoldValue,doublenewValue){}publicdoubleScaleValue{get{return(double)GetValue(ScaleValueProperty);}set{SetValue(ScaleValueProperty,value);}}#endregionprivatevoidMainGrid_SizeChanged(objectsender,EventArgse){CalculateScale();}privatevoidCalculateScale(){doubleyScale=ActualHeight/250f;双xScale=ActualWidth/200f;双精度值=Math.Min(xScale,yScale);ScaleValue=(double)OnCoerceScaleValue(myMainWindow,value);}}和XAML:JacobJ给出了一个很好的答案,我试过了并且它工作得很好对于任何感兴趣的人,我做了一个额外的行为来做同样的事情。我还添加了从XAML指定宽度/高度分母的选项。它可以像这样使用ScaleToWindowSizeBehaviorpublicstaticclassScaleToWindowSizeBehavior{#regionParentWindowpublicstaticreadonlyDependencyPropertyParentWindowProperty=DependencyProperty.RegisterAttached("ParentWindow",typeof(Window),typeof(ScaleToWindowSizeBehavior),newFrameworkPropertyMetadata(null,OnParentWindowChanged));publicstaticvoidSetParentWindow(FrameworkElementelement,Windowvalue){element.SetValue(ParentWindowProperty,value);}publicstaticWindowGetParentWindow(FrameworkElementelement){return(Window)element.GetValue(ParentWindowProperty);}privatestaticvoidOnParentWindowChanged(DependencyObjecttarget,DependencyPropertyChangedEventArgse){FrameworkElementmainElement=targetasFrameworkElement;Windowwindow=e.NewValueasWindow;ScaleTransformscaleTransform=newScaleTransform();scaleTransform.CenterX=0;scaleTransform.CenterY=0;BindingscaleValueBinding=newBinding{Source=window,Path=newPropertyPath(ScaleValueProperty)};BindingOperations.SetBinding(scaleTransform,ScaleTransform.ScaleXProperty,scaleValueBinding);BindingOperations.SetBinding(scaleTransform,ScaleTransform.ScaleYProperty,scaleValueBinding);mainElement.LayoutTransform=scaleTransform;mainElement.SizeChanged+=mainElement_SizeChanged;}#endregion//ParentWindow#regionScaleValuepublicstaticreadonlyDependencyPropertyScaleValueProperty=DependencyProperty.RegisterAttached("ScaleValue",typeof(double),typeof(ScaleToWindowSizeBehavior),newUIPropertyMetadata(1.0,OnScaleValueChanged,OnCoerceScaleValue));publicstaticdoubleGetScaleValue(DependencyObjecttarget){return(double)target.GetValue(ScaleValueProperty);}publicstaticvoidSetScaleValue(DependencyObjecttarget,doublevalue){target.SetValue(ScaleValueProperty,value);}privatestaticvoidOnScaleValueChanged(DependencyObjecttarget,DependencyPropertyChangedEventArgse){}privatestaticobjectOnCoerceScaleValue(DependencyObjectd,objectbaseValue){if(baseValueisdouble){doublevalue=(double)b??aseValue;如果(double.IsNaN(value)){返回1.0f;}value=Math.Max(0.1,value);返回值;}返回1.0f;}privatestaticvoidmainElement_SizeChanged(objectsender,SizeChangedEventArgse){FrameworkElementmainElement=senderasFrameworkElement;窗口window=GetParentWindow(mainElement);计算比例(窗口);}privatestaticvoidCalculateScale(Windowwindow){大小分母=GetDenominators(window);doublexScale=window.ActualWidth/denominators.Width;doubleyScale=window.ActualHeight/denominators.Height;双精度值=Math.Min(xScale,yScale);SetScaleValue(窗口,值);}#endregion//ScaleValue#regionDenominatorspublicstaticreadonlyDependencyPropertyDenominatorsProperty=DependencyProperty.RegisterAttached("Denominators",typeof(Size),typeof(ScaleToWindowSizeBehavior),newUIPropertyMetadata(newSize(1000.0,700.0)));publicstaticSizeGetDenominators(DependencyObjecttarget){return(Size)target.获取值(分母属性);}publicstaticvoidSetDenominators(DependencyObjecttarget,Sizevalue){target.设置值(分母属性,值);}#endregion//Denominators}对FredrikHedblad回答的小修正:因为您在Grid元素中设置了DependencyProperty“Denominators”:您必须使用网格调用GetDominator方法相反:privatestaticvoidCalculateScale(Windowwindow){Sizedenominators=GetDenominators(window);一定要用这样的东西:有用,需要多了解C#学习教程,希望大家多多关注—privatestaticvoidmainElement_SizeChanged(objectsender,SizeChangedEventArgse){窗口window=GetParentWindow(mainElement);CalculateScale(窗口,mainElement);}privatestaticvoidCalculateScale(Windowwindow,FrameworkElementmainElement){大小分母=GetDenominators(mainElement);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: