我正在修改现有的WiX安装程序以处理更新我们其中一个产品的现有安装.有几个值的默认值在属性中指定.这些属性将显示给用户进行编辑,然后由现有安装程序写入自定义配置文件.
我的代码需要足够智能,以检测它是否正在进行全新安装而不是安装旧版本.如果它正在进行全新安装,则需要将属性设置为默认值.但是,如果它正在进行升级,则代码需要从现有配置文件中检索这些属性的值,并将其显示给用户.
从我已经完成的阅读中,我觉得我需要使用51类自定义动作来设置属性.但是,如何实现此自定义操作?
我想我必须首先定义自定义操作以将其放入自定义操作表中,然后我需要在某个地方粘贴一个标记来调用它.然后我需要定义它.
我怎样才能做到这一点?一些示例代码是什么?
我知道以下函数以domain\username格式返回当前Windows用户的名称.
Convert.ToString( WindowsIdentity.GetCurrent().Name );
Run Code Online (Sandbox Code Playgroud)
但是如何以username@domain
格式获取用户名?
编辑:
我在这个编辑中做出回应,因为回复的每个人都有相同的基本想法.
根据我的理解,从domain\username
格式中解析名称并将其构造为username@domain
不安全或建议.我相信这是因为不能保证这两个域名在不同的格式中是相同的.例如,在我工作的公司中,格式的domain
一部分domain\username
基于deparment,但在username@domain
,它是公司名称.这是需要DNS查找的事情.
我希望有一个API执行此DNS查找.我想我应该把这些信息放到原来的问题中.抱歉.
我有一个包含许多表的SQLite数据库.我们正在编写一个维护工具,它将从表中删除"陈旧"数据,直到该表的大小为总数据库文件的某个百分比或更小.
我知道如何确定数据库文件的大小 - 我是通过执行来实现的
PRAGMA PAGE_SIZE;
Run Code Online (Sandbox Code Playgroud)
和
PRAGMA PAGE_COUNT;
Run Code Online (Sandbox Code Playgroud)
在两个单独的查询中,并将两者相乘以获取文件大小(以字节为单位).是的,我知道我可以以字节为单位获取文件的大小,但这与我在其他数据库中完成它的方式类似,我想坚持使用它,至少目前是这样.
我的问题是我不知道如何获得TABLE的大小.必须有一些方法来做到这一点.谁能指出我正确的方向?
我正在构建一个WPF 4应用程序.在过去,Snoop能够看到应用程序,但现在却没有.Snoop 2.7.1和2.8.0也是如此.
也就是说,我点击刷新按钮,我的应用程序不会显示在下拉控件中.我将十字准线拖到窗户上,它什么也没做.
我正在调试一些模板问题时,我真的需要窥探我的应用程序.有人可以帮忙吗?
我的应用程序将在具有触摸风格的计算机上运行,由驾驶员在驾驶时操作.我将所有的图形元素都做得更大,这样它们就可以被像我自己和更大的香肠手指一样的人操作.
我有一个需要出现在屏幕上的CheckBox.我需要缩放复选框的大小和复选标记.我尝试通过右键单击并选择Edit Tempate |来编辑Expression Blend中Checkbox的模板 编辑副本.我设置了副本,因此它适用于所有复选框.
我能够通过模板将它的高度和宽度属性绑定到控件的ActualHeight来使框更大.但是,复选标记没有因此而增长,位于左上角.至少可以说它看起来不对.
当我编辑模板时,这是我回来的Xaml:
<Style TargetType="{x:Type CheckBox}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/>
<Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<BulletDecorator Background="Transparent" SnapsToDevicePixels="true">
<BulletDecorator.Bullet>
<Microsoft_Windows_Themes:BulletChrome BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" IsChecked="{TemplateBinding IsChecked}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="{TemplateBinding ActualHeight}" Height="{TemplateBinding ActualHeight}"/>
</BulletDecorator.Bullet>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</BulletDecorator>
<ControlTemplate.Triggers>
<Trigger Property="HasContent" Value="true">
<Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
<Setter Property="Padding" …
Run Code Online (Sandbox Code Playgroud) 我的WPF应用程序中有一个搜索屏幕.该屏幕在TabControl的TabItem中实现为UserControl.当用户切换到"搜索"选项卡时,我希望焦点进入一个特定字段.
所以我在Xaml中的UserControl标签中添加了一个Loaded事件处理程序,并且我调用了控件的Focus方法,我想在Loaded事件处理程序中获得初始焦点.这很有效,直到我升级了今天使用的Telerik控件库.现在,当我切换到"搜索"选项卡时,焦点不在我想要的字段中,但我无法分辨出哪个控件具有焦点.
由于其他原因,我想要拥有焦点的字段已经有GotFocus和LostFocus事件处理程序.我记得在Win Forms中,LostFocus事件处理程序参数告诉您哪个控件将获得焦点.所以我在LostFocus处理程序中放置了一个断点,并发现WPF中LostFocus事件处理程序的参数不包含该信息.
如何在不在我的UserControl中的每个控件上放置GotFocus处理程序的情况下找出焦点的位置?
托尼
我一直在使用Visual Studio中的C#进行所有开发,首先是2010年,现在是2012.我需要使用C语言为我正在进行的项目创建一个DLL.只有当我做File | 新项目,我找不到使用C创建DLL的选项.
你怎么做到这一点?
我的应用程序是一个WPF应用程序,它已经具有较旧类型的系统DPI感知代码,该代码适用于除8.1之外的每个版本的Windows.事实证明,微软在Windows 8.1中添加了许多功能,作为实现每个监视器DPI感知的一部分.我需要在我的程序中实现代码以支持这种类型的DPI感知.
我有文档列出了每个监视器的DPI感知功能及其参数.我需要将它们导入C#并从我的窗口类中调用它们.但我不知道哪些DLL包含这些功能!GetProcessDpiAwareness
例如,该函数的文档并未指出它所在的DLL.
如何找到DLL中的导出内容?
我在Entity Framework模型中看到了一种奇怪的行为.我有一个看起来像这样的查询:
var rows = ( from alarm in context.Alarms
join temp in context.ListDetails on alarm.ListDetailId equals temp.ListDetailId into entries from entry in entries.DefaultIfEmpty()
join read in context.Reads on alarm.ReadId equals read.ReadId
join plate in context.Images on alarm.ReadId equals plate.ReadId
where alarm.IActive == 1 && ! alarm.TransmittedAlarm
where read.IActive == 1
where plate.IActive == 1 && plate.ImageTypeId == 2
select new { alarm, entry, read, plate } ).ToArray();
Run Code Online (Sandbox Code Playgroud)
该查询按列名称按字母顺序返回所有列.事实证明,对于结果集中的几行,此列为NULL.当我在调试器中展开rows变量时,我看到整行是空的!
编辑:一些澄清.
通过"第一列",我的意思是第一行的第一列,即"SELECT A,B,C FROM ...",我的意思是A.实际上,实体框架构建的查询返回所有的连接结果集中的列按字母顺序排列,第一个按字母顺序排列可为空,对于某些行为空.
有问题的列不是主键; 如果它是主键,则不能为空.
当Entity Framework将返回数据的行处理为对象时,它会查看每行中第一列的值.如果该列为null,则为该行返回null,而不是具有与该列对应的属性设置为null的对象.
我不相信这与左外连接有任何关系; 只是我的查询使用了一个.但是,我没有做任何测试来验证这一点,所以这只是一个假设. …
我正在编写一个C#程序,它从JPEG文件中提取EXIF DateTimeOriginal字段,如果该属性在数据中,我需要将其解析为一个DateTime
值.我的代码是:
BitmapFrame src = decoder.Frames[ 0 ];
if ( src.Metadata != null ) {
BitmapMetadata metaData = (BitmapMetadata) src.Metadata;
if ( metaData.ContainsQuery( "/app1/{ushort=0}/{ushort=34665}/{ushort=36867}" ) ) {
object o = metaData.GetQuery( "/app1/{ushort=0}/{ushort=34665}/{ushort=36867}" );
if ( o != null && o is string ) {
string originalDate = Convert.ToString( o );
if ( originalDate != null ) {
if ( !DateTime.TryParseExact( originalDate.Trim(), "yyyy:MM:dd hh:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out createDate ) ) {
// Sets createDate to a default value if …
Run Code Online (Sandbox Code Playgroud)