小编Sam*_*Sam的帖子

在xaml窗口和usercontrol WPF之间传递参数

如何将参数从xaml窗口传递给WPF usercontrol构造函数?我已经尝试创建依赖属性,但它无法做到.我应该尝试xaml扩展还是有其他方法可以做到这一点?

<local:Myusercontrol Param1="user1"/>
Run Code Online (Sandbox Code Playgroud)

调用的xaml.cs Window,以及它的用户控件.

public partial class SomeView : UserControl
{
    SomeViewModel vm = new SomeViewModel();
    public SomeView()
    {
        this.DataContext = vm;
        InitializeComponent;
    }
}
Run Code Online (Sandbox Code Playgroud)

InitializeComponent 在创建用户控件的实例之前,上面的窗口清除通过xaml设置的依赖项属性的值,因此depencency属性的值始终为null.

和usercontrol的xaml.cs

Myusercontrol : UserControl
{
  public Myusercontrol (string User)
  {
    InitializeComponent();
    UserControlViewModel vm = new UserControlViewModel (User);
    this.DataContext = vm;
  }
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是MVVM模式.

.net c# wpf xaml mvvm

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

使用ExtractToDirectory方法解压缩会扭曲非拉丁符号

我有几个文件夹,一些文件夹的名称中包含非拉丁符号(在我的情况下是俄语).此文件夹在"D:\ test.zip"中发送到zip存档(由Windows资源管理器).然后我执行方法

    ZipFile.ExtractToDirectory(@"D:\test.zip", @"D:\result");
Run Code Online (Sandbox Code Playgroud)

它成功地解压缩了所有内容,但所有非拉丁符号都变成了错误.

例如,我得到"D:\ result \ЄбЄ¤л\ file.txt"而不是"D:\ result\каскады\ file.txt".

我的系统的默认编码是windows-1251,我通过参与Encoding.GetEncoding("windows-1251")第三个参数ExtractToDirectory并得到相同的结果来验证.我也尝试过UTF-8,但在路径中有另外的文物("D:\ result\ ᪠ \file.txt").尝试使用Unicode返回有关不支持编码的消息.

当我通过执行方法通过代码创建相同的存档时

    ZipFile.CreateFromDirectory(@"D:\zipdata", @"D:\test.zip");
Run Code Online (Sandbox Code Playgroud)

然后,即使没有指定特定的编码,也可以使用与问题顶部相同的代码行解压缩.

问题是:如何从归档中获取正确的编码以便在ExtractToDirectory方法中应用它,因为在实际任务归档中来自外部源并且我不能依赖于它"通过手"或编程创建的位置?

编辑
问题,非拉丁符号(中文)也会导致问题,但这个事实就像解决问题一样,而这对我的情况来说确实是个问题.

c# zip encoding localization archive

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

双击时,防止单击WPF控件

Image控制了PreviewMouseLeftButtonDown事件处理.逻辑是在单击发生时更改图像内容,并在双击时激活其他视觉样式.

我知道ClickCount属性就像一些答案所说的那样(例如这个)并且成功地区分单击/双击,但问题是单击总是发生,其中双击跟随或不跟随下一刻(这是公平的,无论如何).因此,双击处理两个操作 - 单击,下一次双击.

问题:有没有防止单一的点击方法之前是双击后存在的权利,比其他处理这种情况有某种神奇的计时器?

编辑:
我发现了一个好的评论问题,这与Windows资源管理器进行了类比 - 单击所选文件后如何等待,并开始重命名,确保第一次点击后没有其他点击.
延迟肯定会存在以解决这个问题的目的,但它是否意味着Windows资源管理器使用完全计时器,或者它可能有一些其他选项(某些属性或事件可以等待)以保持单击以防双击发生?

c# wpf click double-click

5
推荐指数
1
解决办法
1835
查看次数

在 XAML 设计器 (XDesProc.exe) 中评估项目完整路径

我有UserControl显示文件信息。我想使用视图模型模拟在 Visual Studio 设计器中查看测试文件信息。这是 XAML:

<Label Content="{Binding DateCreated}"/>
Run Code Online (Sandbox Code Playgroud)

视图模型:

internal class ViewModel
{
    public ViewModel(string pathToFile) 
    {
        var file = new FileInfo(pathToFile);
        this.DateCreated= file.CreationTime.ToShortDateString();
    }

    public string DateCreated{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在设计时,我使用视图模型模拟类在设计器中看到真实的文件信息:

internal class ViewModelMock : ViewModel
{
    public ViewModelMock() : base(@"D:\Images\mock.png")
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过d:DataContext和插入模拟到xaml d:DesignInstance

<UserControl ...
    xmlns:mocks="clr-namespace:Company.Product.Mocks"
    d:DataContext="{d:DesignInstance mocks:ViewModelMock, DesignTimeCreatable=True}">
Run Code Online (Sandbox Code Playgroud)

它有效,但问题出在这个@"D:\Images\mock.png" 硬编码的 value 中。一旦解决方案由 TFS 提供支持,我需要将图像放入项目中,并从ViewModelMock, 相对于项目路径引用此图像。

我怎样才能做到这一点?

像获取当前工作目录这样的简单方法给出了“ C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE ”,我猜是因为这是负责 Visual …

c# wpf design-time mvvm visual-studio

5
推荐指数
0
解决办法
454
查看次数

将"nameof"关键字与set-only属性一起使用

在我的函数中,我接收实现IMediaPanel接口的对象:

public interface IMediaPanel
{
    bool IsListsAreaVisible { get; }
    bool IsNextEntityExists { set; }
}

private void InitConnections(IMediaPanel panelControl)
{
    // Initialization logic
}
Run Code Online (Sandbox Code Playgroud)

在初始化期间,我需要指定属性的名称,我正在使用C#6.0 nameof关键字:

nameof(IMediaPanel.IsListsAreaVisible)
Run Code Online (Sandbox Code Playgroud)

这工作正常,但使用此表达式:

nameof(IMediaPanel.IsNextEntityExists)
Run Code Online (Sandbox Code Playgroud)

Visual Studio向我显示以下错误:

属性"MyNamespace.IMediaPanel.IsNextEntityExists"没有getter.

搜索"名称限制"并没有给我任何关于这个问题的答案,而且官方评论不包含对财产获取者的限制:

...以下值得一提的是产生错误:预定义类型(例如,int或void),可空类型(Point?),数组类型(Customer [,]),指针类型(Buffer*),限定别名(A :: B),以及未绑定的泛型类型(Dictionary <,>),预处理符号(DEBUG)和标签(循环:)....

任何人都可以解释为什么有这个限制,如果有任何参考?什么原因可以强制nameof关键字使用属性的实例getter,而它应该(我猜)只是通过Reflection使用一般类型信息?(至少在这种特殊情况下,当由于未知类型而无法直接指向实例的属性时,我只知道此实例实现了接口)

更新

为了解释为什么@ Gusdor的评论建议不起作用,我需要澄清我如何调用InitConnections函数(简化形式):

public void Init(FrameworkElement panelControl)
{
    // ... Other logic ...
    this.InitConnections((IMediaPanel) panelControl);
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我nameof(panelControl.IsNextEntityExists)在内部使用Init函数,它将产生错误,因为FrameworkElement不包含自定义客户端的IsNextEntityExists属性.如果我在InitConnections函数中使用相同的表达式,我会得到关于getter的错误 - 与使用相同 …

c# getter visual-studio c#-6.0 nameof

5
推荐指数
1
解决办法
253
查看次数