我是WPF的新手。我的要求是以干净的方式实现样式。样式包括字体,颜色,布局,大小。等
带有样式的示例实现如上所示。要求是在一个窗口中,如果它是一个从用户接收输入的表单,常见的样式需要像标签必须右对齐,文本框必须左对齐,一些宽度和一些属性和前景属性。
我的实施
我做了一个单独的程序集(因为它不仅包括其他用户控件,样式,资源),它有一个Layout.Xaml资源字典,并且在其中定义了所有样式。
然后创建依赖属性,并通过该链接链接,如下所示。
<Window xmlns:MvvmLibsTests="clr-namespace:CreativeEye.TestConsole.MvvmLibsTests"
x:Class="CreativeEye.TestConsole.MvvmLibsTests.StyleTestView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SyleTestView" Height="408" Width="706"
WindowStartupLocation="CenterScreen"
xmlns:Styles="clr-namespace:CreativeEye.MvvmLibs.Behaviours;assembly=CreativeEye.MvvmLibs">
<!--<Grid>-->
<Grid Styles:SetLayout.Resources="{StaticResource FormLayoutStyle}">
</Grid>
</Window>
其中 FormLayoutStyle 具有值
<s:String x:Key="FormLayoutStyle">pack://application:,,,/CreativeEye.MvvmLibs;component/Resources/Layout.xaml</s:String>
在应用程序的App.Xaml中。
依赖属性的代码是
public static readonly DependencyProperty ResourcesProperty = DependencyProperty.RegisterAttached(
"Resources",
typeof(string),
typeof(SetLayout),
new PropertyMetadata("", new PropertyChangedCallback(CallBack)));
private static void CallBack(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var layoutGridStylePath = e.NewValue;
if (layoutGridStylePath == null)
{
return;
}
var uri = new Uri((string)layoutGridStylePath, UriKind.RelativeOrAbsolute);
var grid = obj as FrameworkElement;
if (grid == null)
{
return;
}
grid.Resources.Source = uri;
}
我实现了结果。
但我想知道这是一个好方法吗?
我还读了一些关于内存泄漏的事情。 参考链接link 1,link 2。
我更困惑。我无法理解。
任何人都可以在我的实现中说这样的内存泄漏问题会是der?
答案 0 :(得分:1)
通常我以这种方式使用资源,但绑定到c#代码也不是一个糟糕的方法。
Dim ordered = L2.
Select(Function(obj, index) New With {.Obj = obj, .OldIndex = index, .IndexInL1 = L1.IndexOf(obj.id)}).
OrderBy(Function(x) If(x.IndexInL1 >= 0, x.IndexInL1, Int32.MaxValue)).
ThenBy(Function(x) x.OldIndex).
Select(Function(x) x.Obj).
ToArray()