相对于元素存储数据字符串的最佳方法

3

如何以最佳、最可行的方式在元素内部存储数据?

我曾经使用单独的XML文件,现在我正在使用标签和工具提示属性。

这是一种字符串类型的数据,例如:

主题数据 Theme1.fg.ffffffff;Theme2.fg.ff000000;

根据窗口大小的边距 Margin.16:9.10,5,10,5;

2个回答

0

使用 WPF/XAML,一个理想的方法是将这样的字符串存储在相应元素的 Resources 中或者在 ResourceDictionary 中。

例如:

<Grid x:Name="myGrid" xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Grid.Resources>
        <sys:String x:Key="ThemeData">Theme1.fg.ffffffff;Theme2.fg.ff000000;</sys:String>
        <sys:String x:Key="Margins">Margin.16:9.10,5,10,5;</sys:String>
    </Grid.Resources>
</Grid>

要使用相同的功能,您有两种方法

XAML 方法

<TextBlock Text="{StaticResource ThemeData}" />

代码后台

string themeData = myGrid.FindResource("ThemeData");

这些资源也可以存储在 ResourceDictionary 中,进而合并到任何元素、窗口甚至整个应用程序中。

例如:

StringResources.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <sys:String x:Key="ThemeData">Theme1.fg.ffffffff;Theme2.fg.ff000000;</sys:String>
    <sys:String x:Key="Margins">Margin.16:9.10,5,10,5;</sys:String>
</ResourceDictionary>

用法

<Grid x:Name="myGrid">
    <Grid.Resources>
        <ResourceDictionary Source="StringResources.xaml" />
    </Grid.Resources>
    <TextBlock Text="{StaticResource ThemeData}" />
</Grid>

或者如果您想合并/覆盖更多资源,可以使用这个选项

<Grid x:Name="myGrid">
    <Grid.Resources>
        <ResourceDictionary xmlns:sys="clr-namespace:System;assembly=mscorlib">
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="StringResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <!--define new resource or even override existing for this specific element -->
            <sys:String x:Key="ThemeData">Theme1.fg.ff00ff00;Theme2.fg.ff0000ff;</sys:String>
            <sys:String x:Key="NewMargins">Margin.16:9.10,5,10,5;</sys:String>
        </ResourceDictionary>
    </Grid.Resources>
    <TextBlock Text="{StaticResource ThemeData}" />
</Grid>

1
这正是我所做的,如果你已经阅读了上一个答案的评论并稍作修改 :D .. 但是在这里,(Y) 是为了让你理解我 ;) 谢谢。 - Enumy

0
据我理解,您可以使用控件的Tag属性来存储信息。它接受对象类型,因此您可以附加任何类型的对象。例如:control.Tag = objectyouwantto attach。 如果我的回答似乎不相关,请详细说明您的问题。

没错,我可以这样做,但标签属性有什么不同之处呢?它与工具提示完全相同!我希望有一种更合适的方式,比如说有所不同。 - Enumy
@Hossam,工具提示只是在悬停在项目上时出现的文本。标签属性是专门添加的,用于将任何你想要的内容塞入对象中。 - crthompson
@paqogomez 谢谢回复,既然我们已经偏离了重点,我已经将标签用作整数值来触发触发器..问题的重点如上所述,我想要一种不同的方法,因为正如你所说,工具提示是在悬停时用作文本。 - Enumy
如果你需要更多的属性,只需创建自己的对象。让它继承你原来的对象并添加一些属性即可。 - crthompson
你可以按照 @paqogomez 的建议通过继承原始对象来实现。或者,你可以创建一个自定义类,该类具有一个 int 属性用于触发器和另一个属性用于存储数据字符串的类型,并将此对象附加为标签。 - kishore V M
谢谢,这给了我完美的想法...我可以使用.resx文件,甚至可以将其编译成二进制文件并包含在程序集中(Y)。 - Enumy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接