小编Dan*_*gel的帖子

如何以编程方式在C#中生成按键事件?

如何以编程方式创建一个模拟键盘上按键的事件?

.net c# wpf keyboard-events

104
推荐指数
5
解决办法
14万
查看次数

在c#代码中使用c ++ dll中定义的类

我有一个用c ++编写的dll,我需要在我的c#代码中使用这个dll.搜索后我发现使用P/Invoke可以访问我需要的函数,但这些函数是在类中定义的,并使用非静态私有成员变量.所以我需要能够创建这个类的实例来正确使用这些函数.如何才能访问此类以便创建实例?我一直无法找到办法.

我想我应该注意c ++ dll不是我的代码.

c# c++ dll pinvoke

66
推荐指数
3
解决办法
8万
查看次数

多个用户控件和跨程序集之间的共享资源字典

我有一个包含多个用户控件的程序集.对于此用户控件程序集,我想要一个资源字典.程序集中的所有用户控件都应该能够访问资源字典.我必须添加吗?

<UserControl.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      ...
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

应该使用资源字典的每个用户控件,还是有某种方法将它放在一个地方并只是引用它?

我可以在我的主应用程序中引用它,还是需要MergedDictionaries调用呢?

编辑:主应用程序位于单独的项目/程序集中,而不是用户控件.

c# wpf resources

17
推荐指数
1
解决办法
2万
查看次数

WPF是我申请缓慢的原因吗?

我正在使用WPF开发一个应用程序.该应用程序全屏运行,无论显示器分辨率如何,我都需要它才能很好地调整大小.图形设计师为UI按钮,背景等设计了精美的图像.使用Illustrator插件,所有图像都已转换为xaml文件.我已将所有这些图像添加到应用程序中,它们看起来很棒.我也使用了很多Grid布局,以便屏幕可以在保持布局的同时调整大小.所有这些都根据需要显示,当以不同的分辨率运行时,没有任何东西看起来拉伸.但是,屏幕转换和UI交互很慢.

我想知道,这是由于图形的大量使用?我使用了太多的Grid布局吗?但是,我需要Grids以便我可以拥有分辨率独立性.

该应用程序在我的开发机器上运行良好,但在具有较低性能的机器上运行速度非常慢.是的,这是可以预料的,但不是我所看到的程度.我的雇主坚持认为应用程序在这些性能较低的机器上运行顺畅.

我已经对应用程序进行了一些分析,看起来需要花费最多时间的是显示内容(尽管我不确定我是否完全理解如何有效地使用分析器).

如果WPF导致速度减慢,我该怎么做才能改善这一点?

c# wpf performance vector-graphics

11
推荐指数
2
解决办法
1万
查看次数

ViewBox是否是用于在WPF中实现分辨率独立性的最佳选择?

我正在开发一个需要独立于分辨率的应用程序.应用程序将始终全屏,因此我必须设计我的UI,以便监视器分辨率不会影响应用程序的使用.我花了很多时间玩WPF试图完成这个.今天我发现了Viewbox.它似乎解决了我所有的问题.我所要做的就是放置用于在Viewboxes中布局每个屏幕的网格,就像魔法我有一个独立于分辨率的应用程序.

但是,这似乎很容易.感觉不对劲.我应该使用Viewboxes吗?如果不是我应该做什么呢?在我发现Viewbox之前,我很难想出一种在分辨率方面扩展字体大小的方法.使用Viewbox,我不必担心这一点.因此,如果使用Viewbox是错误的,我该如何调整文本大小?

wpf resolution-independence

8
推荐指数
2
解决办法
5109
查看次数

更新数据绑定组合框

我有几乎同样的问题:

C#更新绑定到通用列表的组合框

但是,我正在尝试更改显示的字符串; 不添加,删除或排序.我已经尝试了引用问题中提供的BindingList解决方案,但它没有帮助.在编辑项目时,我可以看到组合框的DataSource属性已正确更新,但组合框中显示的内容不是DataSource属性中的内容.

我的代码如下:

mSearchComboData = new List<SearchData>();
mSearchComboData.Add(new SearchData("", StringTable.PatientID));
mSearchComboData.Add(new SearchData("", StringTable.LastName));
mSearchComboData.Add(new SearchData("", StringTable.LastPhysician));
mSearchComboData.Add(new SearchData("", StringTable.LastExamDate));

mBindingList = new BindingList<SearchData>(mSearchComboData);

SearchComboBox.Items.Clear();
SearchComboBox.DataSource = mBindingList;
SearchComboBox.ValueMember = "Value";
SearchComboBox.DisplayMember = "Display";

...
Run Code Online (Sandbox Code Playgroud)

当我尝试更新内容时,我会执行以下操作:

int idx = SearchComboBox.SelectedIndex;
mBindingList[idx].Display = value;
SearchComboBox.Refresh();
Run Code Online (Sandbox Code Playgroud)

编辑::

RefreshItems似乎是一个私有方法.我只是收到错误消息:

"'System.Windows.Forms.ListControl.RefreshItems()'由于其保护级别而无法访问"

ResetBindings无效.

.net c# combobox refresh

7
推荐指数
1
解决办法
2万
查看次数

使WPF弹出窗口不受屏幕限制

弹出窗口的默认行为是,如果它放置在超出屏幕边缘的位置,Popup将重新定位自身.有没有办法解决这个问题?

我有一个用户可以在屏幕上拖动的Popup.但是,当它到达边缘时会卡住.它会卡在边缘并停留在那里,直到鼠标被拖离边缘.此外,我有两个显示器,当弹出窗口被拖到边缘时,两个显示器共享我闪烁.弹出窗口在两个监视器之间闪烁.

c# wpf popup

7
推荐指数
1
解决办法
3020
查看次数

获取Windows用户显示名称的可靠方法

我需要获取当前用户的显示名称,并找不到始终有效的解决方案.为了清楚起见,我不是在寻找用户名.我需要"John Doe"."开始"菜单上显示的值.

关于这个问题有很多帖子,但没有一个解决了我的问题.

获取Windows用户显示名称

如何获取当前登录用户的AD显示名称

这两个帖子引导我:

PrincipalContext context = domain.Equals(Environment.MachineName, StringComparison.CurrentCultureIgnoreCase) ?
    new PrincipalContext(ContextType.Machine) :
    new PrincipalContext(ContextType.Domain, domain);

UserPrincipal userPrincipal = new UserPrincipal(context) { SamAccountName = username };
PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal);
userPrincipal = searcher.FindOne() as UserPrincipal;

string displayName = userPrincipal.DisplayName;
Run Code Online (Sandbox Code Playgroud)

这段代码大部分都适用.但是,如果用户已在其计算机上禁用/停止了服务器服务,则会出现"服务器服务未启动"的异常.

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName
Run Code Online (Sandbox Code Playgroud)

同样的错误.

如何在Windows中登录用户的全名?

StringBuilder name = new StringBuilder(1024);
uint userNameSize = (uint)name.Capacity;
const int NameDisplay = 3;
GetUserNameEx(NameDisplay, name, ref userNameSize)
Run Code Online (Sandbox Code Playgroud)

不返回错误,但如果用户不在域中,则返回空字符串.

如何可靠地在所有版本的Windows上读取用户的显示(第一个和最后一个)名称?

// get SAM compatible name <server/machine>\\<username>
if (0 != GetUserNameEx(2, username, ref userNameSize))
{ …
Run Code Online (Sandbox Code Playgroud)

c# active-directory

7
推荐指数
1
解决办法
2793
查看次数

在后面的代码中使用资源图像

我需要动态更改应用于我的一个按钮的背景图像,但无法弄清楚如何.图像将添加到项目中,并将其"构建操作"设置为"资源".我试过以下:

buttonUnits.Background = new ImageBrush(new BitmapImage(new Uri("/Images/InchDOWN.png",UriKind.Relative)));
Run Code Online (Sandbox Code Playgroud)

这成功编译,但会在DirectoryNotFoundException崩溃时说"无法找到路径的一部分'C:\ Images\InchDOWN.png'."

我不希望应用程序在磁盘上查找图像.如何将图像用作嵌入式资源?我认为它涉及将构建操作更改为嵌入式资源,但如何在后面的代码中使用此资源?

c# wpf resources visual-studio

6
推荐指数
1
解决办法
1万
查看次数

强制在主线程上执行代码

如何强制在我的主线程上执行一段代码?

这就是为什么我想知道:

我有一个自定义创建的消息框,有时从一个不是主线程的线程显示.但是,当调用消息框构造函数时,我得到一个InvalidOperationException,说"调用线程必须是STA,因为许多UI组件都需要这个." 这是有道理的,需要在主线程上处理UI元素.

我的MessageBox.ShowMessage(...)函数是一个静态函数,它创建我的自定义消息框的实例并显示它.是否有一些东西可以放在ShowMessage中,它会强制创建消息框并显示在主线程上?在我的代码的其他地方,我使用Control.BeginInvoke来处理类似的问题,但由于它是一个静态函数,因此我没有现有的UI元素来调用BeginInvoke.

我是否必须使用Control.BeginInvoke调用MessageBox.ShowMessage?我更喜欢从ShowMessage中调用BeginInvoke(或一些等价物).

c# wpf multithreading

6
推荐指数
2
解决办法
4403
查看次数