我是WPF的新手,我不知道该怎么做我想做的事.
我已经构建了一个自定义控件,我称之为音量控制.它有2个RepeatButtons,1个用于增加Volume属性的值,1个用于减少它,还有一个ProgressBar用于给出当前Volume的可视化表示.该控件具有Orientation类型的名为"Orientation"的属性.当它是水平的时候,我希望控制以一种方式绘制,当它是垂直时,我希望它看起来不同.
在水平模式下,控件将简单地将3个控件放在水平StackPanel中.垂直外观有点复杂,因为它有一个网格,有2列和2行.2个RepeatButtons在左侧堆叠在一起,而ProgressBar跨越两行并且在右侧.
我似乎无法弄清楚如何使控件根据Orientation属性的值更改其外观.这是我到目前为止所得到的:
<Style x:Key="Horizontal" TargetType="{x:Type cs:VolumeControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type cs:VolumeControl}">
<StackPanel Orientation="Horizontal">
...
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="Vertical" TargetType="{x:Type cs:VolumeControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type cs:VolumeControl}">
<Grid>
...
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
我知道我需要这样的东西来定义默认模板和Orientation属性的必要触发器:
<Style TargetType="{x:Type cs:VolumeControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type cs:VolumeControl}">
<ControlTemplate.Triggers>
<Trigger Property="Orientation" Value="Horizontal">
???
</Trigger>
<Trigger Property="Orientation" Value="Vertical">
???
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
我不知道在两个Trigger标签中加入什么来使它工作.或者即使我已经把它弄好了.
我查看了ProgressBar的模板,当Orientation设置为Vertical时,它使用RotationTransform垂直绘制控件.我不能这样做,因为意图是以不同的布局绘制控件.
任何帮助表示赞赏.
托尼
我的项目中有一个名为"CarSystemWindow"的自定义控件类.它来自Window,并有一个自定义模板,为我的应用程序中的所有窗口提供相同的外观.它还定义了两个名为DeviceName和DeviceType的依赖项属性.这些是字符串类型.它们分别默认为"Vehicle:"和"Car 54".
在我的主程序中,我从数据库中检索一行到View Model对象,并在程序初始化期间将其保存在名为Site的普通CLR属性中.在MainWindow的xaml中,我有以下代码:
<cs:CarSystemWindow x:Class="....MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:..."
xmlns:cs="..."
Background="Black"
Closed="Window_Closed"
DataContext="{Binding Path=Site, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
DeviceName="{Binding Path=SiteName}"
DeviceType="{Binding Path=SiteTypeName}"
Icon="..."
Height="600"
Loaded="Window_Loaded"
ResizeMode="CanMinimize"
SourceInitialized="Window_SourceInitialized"
Title="Window Title"
Width="800"
WindowStartupLocation="CenterScreen">
Run Code Online (Sandbox Code Playgroud)
在运行时,DataContext属性上的绑定失败,并显示以下消息:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=Site; DataItem=null; target element is 'MainWindow' (Name=''); target property is 'DataContext' (type 'Object')
Run Code Online (Sandbox Code Playgroud)
我在其他地方使用相同的绑定代码,它的工作原理.我甚至将Site属性转换为依赖属性,但它仍然失败.
有没有人有想法为什么绑定失败?
谢谢
托尼
我已经为我的安装程序定义了一个自定义操作.安装程序似乎没有运行.
以下是WXS文件中定义自定义操作的行:
<CustomAction Id="GetConfigProperties" BinaryKey="GetPropertiesDLL" DllEntry="GetPropertiesFromConfigFile" />
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallInitialize" />
<Custom Action="NewerVersionDetected" After="FindRelatedProducts">NEWERVERSIONDETECTED</Custom>
<Custom Action="GetConfigProperties" After="FindRelatedProducts"></Custom>
. . .
</InstallExecuteSequence>
<Binary Id="GetPropertiesDLL" SourceFile="$(var.LPRCore Installer CBP Helper.TargetDir)\LPRCore Installer CBP Helper.CA.dll" />
Run Code Online (Sandbox Code Playgroud)
我用Orca检查了MSI,相应的条目在MSI表中.
以下是CustomActions.cs
文件中代码的摘录:
[CustomAction]
public static ActionResult GetPropertiesFromConfigFile(Session session) {
// Output a start message to the install log
session.Log( "Begin GetPropertiesFromConfigFile" );
. . .
return ActionResult.Success;
}
Run Code Online (Sandbox Code Playgroud)
代码中还有一些其他session.Log
语句,我想看看发生了什么.
现在,我已启用日志记录.当我在记事本中查看日志文件时,我看不到来自我的调用的消息session.Log
.我看不到任何一个引用GetConfigProperties
.看来自定义操作根本没有执行.我做错了什么?
我的 WPF 程序使用具有 WPF 地图控件的第三方地图包。我的程序需要能够在没有安装该软件的系统上运行,并且需要足够智能来识别该软件何时安装并使用它。这意味着我无法在表单的 XAML 文件中包含地图控件的任何 XAML,否则会引发 XAML 解析异常。
我有一种确定软件是否已安装的技术。在我的程序的初始化代码中,我设置了 Application 对象的一个属性,名为MapsAreInstalled
为 true,如果未安装,则将其设置为 false。
在我的表单(即 UserControl)中,我添加了 OnApplyTemplate 方法的重写。这将检查属性的值MapsAreInstalled
,如果该值为 true,则创建一个新的地图控件。以下是我在必须改变方法之前用来创建此控件的 XAML:
<telogis:MapControl ButtonBase.Click="CarImage_Click"
Canvas.Left="0"
Canvas.Top="0"
Center="41.366674544084,-73.6112966322899"
DragBehavior="None"
Heading="0"
Height="{Binding ElementName=ChannelCanvas, Path=ActualHeight}"
MapQuality="Perfect"
Name="ReadMap"
Perspective="TwoD"
RenderLabels="True"
UiEnable="True"
Width="{Binding ElementName=ChannelCanvas, Path=ActualWidth}"
Zoom="50" />
Run Code Online (Sandbox Code Playgroud)
我知道如何在背后的代码中初始化所有这些属性,除了ButtonBase.Click
事件处理程序。如何在代码隐藏中进行设置?
托尼
我的应用程序使用Log4net写入事件查看器.这是我程序的App.config文件的log4net部分:
<log4net>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
<applicationName value="CarSystem" />
<logName value="CarSystemLog" />
<threshold value="DEBUG" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="EventLogAppender" />
</root>
</log4net>
Run Code Online (Sandbox Code Playgroud)
现在,这些设置工作正常,直到前天下午12:30左右.突然,(当我需要查看日志中的消息时),它停止写入日志文件.
自定义事件日志位于查看器中.我今天重新启动了这台机器,但仍然没有新的东西进入日志.我将最大日志大小增加到10880 KB.
为什么不再将log4net写入我的日志文件?
我有一个为.NET 4 Full Framework编写的WPF应用程序.该应用程序使用SQL Anywhere作为其数据库.我的应用程序有一个未处理的异常处理程序,它总是将错误记录到程序的自定义事件日志中.然后它会向用户显示错误消息.该程序还会在事件日志中发送消息,以便更快地进行调试.
该应用程序安装在用户的笔记本电脑上,该笔记本电脑运行Windows 7并具有8 GB的RAM.在本机上启动时,会显示启动画面,然后显示程序的主窗口.绘制后不到一秒钟,程序就会死掉.没有显示错误消息.
检查事件日志表明程序的最后一条消息是它正在检查数据库中是否存在用户.没有错误消息.
显示的最后一条消息之后的代码是对方法的调用,该方法执行一些参数检查,然后执行以下EF查询:
LPRCore.CarSystem.User user = null;
IQueryable<User> query = from u in context.Users
from m in context.Members.Where( m => m.UserId == u.UserId )
.DefaultIfEmpty()
where u.LoweredUserName == userName.ToLower() && m == null
select u;
try {
user = query.SingleOrDefault();
} catch ( Exception ex ) {
....
}
Run Code Online (Sandbox Code Playgroud)
我无法判断是否曾调用catch块中的代码.我怀疑是它被调用,并且在那里发生了异常.
我的问题是,如果在catch块中发生异常,如果没有其他异常处理程序来捕获错误,那么上层的Unhandled Exception处理程序是否不会捕获该异常?或者它会导致程序死亡而不报告任何内容?
我有一个WPF应用程序,我正在修改以支持本地化.我的程序是我公司提供的一系列产品的一部分.我们创建了一个资源DLL,其中包含了我们所有产品需要翻译的所有字符串.我已经向我的程序添加了对此DLL的引用,向其添加了字符串资源,并修改了我的代码以使用字符串资源而不是硬编码字符串.当我用英语运行程序时,一切正常.
我们已将字符串资源翻译成西班牙语.我创建了一个带有西班牙语翻译的resx文件.我重建了我的申请表.现在我希望看到西班牙语文本出现在我的程序中,而无需更改计算机的文化设置.
程序无需动态更改文化设置.该程序将仅以特定安装的一种语言运行.
该程序有一个App.config文件.如果没有添加包含文化信息的自定义设置,如何告诉我的程序以西班牙语运行?
我的程序使用一些 WPF API 来处理文件夹中的图像。我需要解析图像中的 EXIF 数据(如果有)才能获取属性的值DateTimeOriginal
。我一直在使用 aBitmapImage
从 a 加载图像MemoryStream
,但我需要一个BitmapFrame
对象来获取该BitmapMetadata
对象。
这是在要求获取DateTimeOriginal
EXIF 属性之前我的原始代码:
BitmapImage src = new BitmapImage();
try {
using ( MemoryStream memoryStream = new MemoryStream( snapshot.ImageData ) ) {
src.BeginInit();
src.CacheOption = BitmapCacheOption.OnLoad;
src.StreamSource = memoryStream;
src.EndInit();
}
} catch ( NotSupportedException ex ) {
. . .
}
Run Code Online (Sandbox Code Playgroud)
现在,要获取BitmapFrame
,我需要创建BitmapDecoder
并使用该Frames[0]
属性。所以我在声明之后添加了以下内容using
:
BitmapDecoder decoder = BitmapDecoder.Create( memoryStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad );
Run Code Online (Sandbox Code Playgroud)
这将解码位图并获取第一个帧,这很酷。我仍然需要创建BitmapImage …
我有一个 WPF 应用程序,我需要将其本地化为西班牙语。我已经阅读了 MSDN 文档,但我很困惑。这很复杂,因为我们公司有一套三个程序一起工作(一个是 Windows 服务,一个是 Web 应用程序,第三个是我的 WPF 应用程序),我们决定构建一个包含可本地化的资源 DLL所有三个产品的字符串。
因此字符串位于资源 DLL 中,将其命名为 resources.dll。现在,原始英文字符串在 XAML 中进行了硬编码。我已经为表单的每个字符串创建了资源 ID ControlType_StringName
。被多个控件使用的字符串被命名为Common_StringName
。
如何编码 XAML 以显示正确的字符串?例如,我有一个关于框。它使用一个名为“About_Copyright”的字符串。在关于框中,有一个TextBlock
显示此字符串。我在Text
属性值中输入什么?
<TextBlock x:Uid="TextBlock_4" FontSize="18"
FontWeight="Bold"
Foreground="{DynamicResource TextForeground}"
Grid.Row="5"
HorizontalAlignment="Center"
Margin="5"
Text="Copyright © 2012, 2013, Elsag North America, Inc." />
Run Code Online (Sandbox Code Playgroud)
完成后,Text
属性中应该有一个引用,引用资源中的“AboutBox_Copyright”字符串。
并且在我的程序资源的资源 DLL 中有一个单独的静态类,称为 CarSystem,因此代码隐藏会将该字符串称为“CarSystem.AboutBox_Copyright”。
我是温莎城堡的菜鸟。我正在构建一个使用实体框架 6 和 Castle Windsor 的应用程序,以及一个 MSTest 单元测试类。我的应用程序中有一个实现IWindsorInstaller
. 我的单元测试类如下所示:
[TestClass]
public class DatabaseTests {
static readonly WindsorContainer Container = new WindsorContainer();
public DatabaseTests() {
Container.Install( FromAssembly.This() );
}
[TestMethod]
public void FirstTest() {
// Test statements
}
[TestMethod]
public void SecondTest() {
// Test statements
}
// Other tests
}
Run Code Online (Sandbox Code Playgroud)
单元测试项目中还有一个安装程序类,如下所示:
public class TestsInstaller : IWindsorInstaller {
public void Install( IWindsorContainer container, IConfigurationStore store ) {
container.Install( new RecipeManager.RepositoriesInstaller() );
}
}
Run Code Online (Sandbox Code Playgroud)
当我转到“单元测试会话”窗口并尝试运行所有测试时,第一个测试成功,其余的我得到此堆栈跟踪:
无法创建类 UnitTests.DatabaseTests 的实例。错误:Castle.MicroKernel.ComponentRegistrationException:无法注册组件 RecipeManager.DAL.CategoryRepository。已经有一个具有该名称的组件。您想改为修改现有组件吗?如果没有,请确保在 Castle.MicroKernel.SubSystems.Naming.DefaultNamingSubSystem.Register(IHandler …
wpf ×7
c# ×6
.net ×4
localization ×2
xaml ×2
app-config ×1
binding ×1
log4net ×1
unit-testing ×1
wix ×1