我们是一个很小的三人WPF商店(C#/ WPF / .NET 4.0 CP),我们每个人仍然相对较新的WPF(不到一年的经验)。我们的应用程序有很多内部的全局常量 - 比如背景颜色,画笔,像素宽度,工具提示字符串 - 我们想要移动到app.config文件。
同时,我希望能够在xaml中直接绑定到这些app.config值。这可能吗?
我已经知道您可以访问此处定义的普通键/值对:
<appSettings>
<add key="TextBlockHeight" value="50"/>
</appSettings>
将命名空间添加到xaml
的xmlns:P =&#34; CLR-名称空间:SampleApp.Properties&#34;
然后在正文中引用
<TextBlock
Height="{Binding Source={x:Static p:Settings.Default}, Path=TextBlockHeight}" />
直到今天我才知道任何这种功能,但这对我来说很有意义。我没有找到任何东西是对这引用的内容的清晰描述
xmlns:p="clr-namespace:SampleApp.Properties"
生成属性对象的人和内容是什么?为什么Binding引用设置。默认?什么是默认的? Settings对象上可以有其他属性吗?
除此之外,我们的应用程序非常复杂,我想做两件事:
1 使用配置部分根据我们自己的内部模块
分离出我们的可配置值这可能是这样的:
<configSections>
<sectionGroup name="Qst2ConfigGroup">
<section name="Qst2Settings" type="WinWam6.Qst2ConfigSection, WW6-WPF" />
</sectionGroup>
</configSections>
...
<Qst2Settings
LoadQst2Async = "true"
AutoDisplayFirstQst2Insp = "true"
AllowQst2ParallelLoad = "true"
AllowMultiThread = "true"
ShowNodeData = "true"
ShowAllFailNotes = "true"
ShowAllRules = "true"
ShowAllValues = "true"
TwipsPerPixelX = "15.0"
TwipsPerPixelY = "15.0" />
2 能够将配置部分从主应用程序传递到DLL中。这些DLL将实现一些报告功能,我们从过去的经验中知道,我们将需要这些配置参数的运行时值。
我现在不太关心#2,对#1更感兴趣。有没有办法说出这样的话:
<Checkbox
IsChecked="{Binding Source={x:Static p:Settings.Qst2ConfigGroup}, Path=Qst2Settings.LoadQst2Async}" />
而且我只是这样,我确实有一个WinWam6.Qst2ConfigSection的支持类。我只是不确定我是否会沿着正确的大道走下去。
答案 0 :(得分:0)
创建应用程序或库时,您可以看到&#34;属性&#34;夹。在此文件夹中,将有Resouces.resx和Settings.settings。
当您引用xmlns:p="clr-namespace:SampleApp.Properties"
时,它实际上会返回此文件夹中的内容。查看Settings.Designer.cs,您可以找到&#34; SampleApp.Properties.Settings&#34;这里定义的是静态属性&#34; 默认&#34; 。这是您想要了解的默认。
因此,实际上您现在使用的是在Settings.settings中定义的,而不是在App.Config中定义的。
如果要在App.Config中使用键/值对,则需要使用System.Configuration.ConfigurationSettings.AppSettings
。但它们都是键/值对,你不能轻易地在XAML中使用它。您可能需要为其添加TypeConverter。
答案 1 :(得分:0)
当您向程序添加设置时,它会将默认值添加到app.config&amp;它将具有该名称的属性添加到Settings.Designer.cs中定义的类。您需要了解一些事项:
我会为设置创建一个视图模型类。该类将实现INotifyPropertyChanged
,并且每个可以修改的设置都有一个属性。每个设置属性的getter将从Settings.Default
检索属性的值。设定者将设置属性&amp;举起PropertyChanged
事件。表单上的“保存/确定”按钮将保存更改。
例如,如果我们有一个名为RootDir
的用户设置,则会看起来像这样:
public class UserSettings : INotifyPropertyChanged {
public string RootDir {
get { return Settings.Default.RootDir; }
set {
Settings.Default.RootDir = value;
OnPropertyChanged( "RootDir" );
}
public event PropertyChangedEventHandler PropertyChanged;
public OnPropertyChanged( string property ) {
PropertyChangedEventHandler h = PropertyChanged;
if ( h != null ) {
h(property);
}
}
}
}
然后,您可以添加RoutedCommand
以保存对用户个人资料的更改。