我应该以哪种方式定义资源字典以保持我的代码清洁?

时间:2015-07-20 09:25:23

标签: c# wpf xaml dictionary

我是WPF的新手。我的要求是以干净的方式实现样式。样式包括字体,颜色,布局,大小。等

Style

带有样式的示例实现如上所示。要求是在一个窗口中,如果它是一个从用户接收输入的表单,常见的样式需要像标签必须右对齐,文本框必须左对齐,一些宽度和一些属性和前景属性。

我的实施

我做了一个单独的程序集(因为它不仅包括其他用户控件,样式,资源),它有一个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 1link 2

我更困惑。我无法理解。

  

任何人都可以在我的实现中说这样的内存泄漏问题会是der?

1 个答案:

答案 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()