小编aka*_*xer的帖子

WPF在多层/项目应用程序解决方案中集中xaml/image资源

我的情况是这样的.我在WPF解决方案下有多个项目,构成我正在开发的多层应用程序.由于单独的项目有时需要访问相同的图像或xaml资源,我希望将"公共"资源集中到一个项目中,该项目可以被需要这些"公共"资源的任何其他项目引用.例如,我有一个BMP图像,我在各个控件和窗口中使用单独的项目作为横幅/徽标.看起来我应该能够将此图像作为资源添加到公共资源项目中,并从我的其他项目中引用它,而不是将图像单独添加到需要它的每个项目中.如果这是可能的,它会是什么样子,我应该怎么做呢?如果我的想法很糟糕我会接受建议,但项目将会非常大,所以我不想在整个地方添加资源.

谢谢!

PS我已经搜索了这个主题了很多但是有很多垃圾回答来自那些不知道他们在做什么的人.鉴于我对WPF比较陌生,我宁愿直接回答我的问题.

wpf xaml user-controls mvvm resourcedictionary

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

将字符串解析为动态类型的最快,最高效,优雅的方法?

我正在寻找在旅途中将字符串转换为各种数据类型的最快(通用方法).

我正在解析由某事物生成的大型文本数据文件(文件大小为几兆字节).此特定函数读取文本文件中的行,根据分隔符将每行解析为列,并将解析后的值放入.NET DataTable中.稍后将其插入数据库中.FAR的瓶颈是字符串转换(Convert和TypeConverter).

我必须采用动态方式(即远离"Convert.ToInt32"等),因为我永远不知道文件中会出现什么类型.类型由运行时期间的早期配置确定.

到目前为止,我已经尝试了以下内容,并且需要花费几分钟来解析文件.请注意,如果我注释掉这一行,它只运行几百毫秒.

row[i] = Convert.ChangeType(columnString, dataType);
Run Code Online (Sandbox Code Playgroud)

TypeConverter typeConverter = TypeDescriptor.GetConverter(type);
row[i] = typeConverter.ConvertFromString(null, cultureInfo, columnString);
Run Code Online (Sandbox Code Playgroud)

如果有人知道这种通用的更快的方式,我想知道它.或者,如果我的整个方法因某种原因而糟透,我愿意接受建议.但请不要指出使用硬编码类型的非通用方法; 这根本不是一个选择.

更新 - 多线程以改进性能测试

为了提高性能,我研究了将解析任务拆分为多个线程.我发现速度有所提高,但仍然没有我想象的那么多.但是,对于那些感兴趣的人,这是我的结果.

系统:

英特尔Xenon 3.3GHz四核E3-1245

内存:12.0 GB

Windows 7 Enterprise x64

测试:

测试功能如下:

(1)接收一个字符串数组.(2)用分隔符分割字符串.(3)将字符串解析为数据类型并将它们存储在一行中.(4)向数据表添加行.(5)重复(2) - (4)直到完成.

测试包括1000个字符串,每个字符串被解析为16列,因此总共16000个字符串转换.我测试了单线程,4个线程(因为四核)和8个线程(因为超线程).因为我只是在这里处理数据,所以我怀疑添加更多的线程比这有什么好处.因此,对于单个线程,它解析1000个字符串,4个线程解析每个250个字符串,8个线程解析每个125个字符串.我还测试了一些使用线程的不同方法:线程创建,线程池,任务和函数对象.

结果: 结果时间以毫秒为单位.

单线程:

  • 方法电话:17720

4个线程

  • 参数化线程开始:13836
  • ThreadPool.QueueUserWorkItem:14075
  • Task.Factory.StartNew:16798
  • Func BeginInvoke EndInvoke:16733

8个线程

  • 参数化线程开始:12591
  • ThreadPool.QueueUserWorkItem:13832
  • Task.Factory.StartNew:15877
  • Func BeginInvoke EndInvoke:16395

正如您所看到的,最快的是使用8个线程的参数化线程启动(我的逻辑核心数).然而,它并没有使用4个线程,并且仅比使用单个核心快约29%.当然结果会因机器而异.我也坚持了

    Dictionary<Type, TypeConverter>
Run Code Online (Sandbox Code Playgroud)

用于字符串解析的高速缓存使用类型转换器数组并没有提供明显的性能提升,并且有一个共享高速缓存类型转换器更易于维护,而不是在我需要时在整个地方创建数组.

另一个更新:

好吧,我跑了一些更多的测试,看看我是否可以挤出更多性能,我发现了一些有趣的东西.我决定坚持8个线程,所有从参数线程Start方法(这是最快的我以前的测试)开始.使用不同的解析算法运行与上面相同的测试.我注意到了

    Convert.ChangeType and TypeConverter
Run Code Online (Sandbox Code Playgroud)

花费大约相同的时间.键入特定的转换器

    int.TryParse
Run Code Online (Sandbox Code Playgroud)

因为我的类型是动态的,所以稍微快一点但不适合我.ricovox对异常处理有一些很好的建议.我的数据确实有无效的数据,一些整数列会为空数字设置' - ',所以类型转换器会爆炸:意味着我解析的每一行我至少有一个例外,那就是1000个异常!非常耗时.

顺便说一句,这就是我使用TypeConverter进行转换的方式.扩展只是一个静态类,GetTypeConverter只返回一个cahced TypeConverter.如果在转换期间抛出异常,则使用默认值.

public static Object ConvertTo(this String arg, …
Run Code Online (Sandbox Code Playgroud)

c# string performance typeconverter

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

如何在 Swagger UI 中使用 OpenAPI 3.0 响应“链接”?

我正在编写 Open API 3.0 规范并尝试获取响应链接以在 Swagger UI v 3.18.3 中呈现。

例子:

openapi: 3.0.0
info:
  title: Test
  version: '1.0'
tags: 
  - name: Artifacts
paths:
  /artifacts:
    post:
      tags: 
        - Artifacts
      operationId: createArtifact
      requestBody:
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
      responses:
        201:
          description: create
          headers:
            Location:
              schema:
                type: string
                format: uri
                example: /artifacts/100
          content:
            application/json:
              schema:
                type: object
                properties:
                  artifactId:
                    type: integer
                    format: int64
          links:
            Read Artifact:
              operationId: getArtifact
              parameters:
                artifact-id: '$response.body#/artifactId'
  /artifacts/{artifact-id}:
    parameters:
      - name: artifact-id
        in: path
        required: …
Run Code Online (Sandbox Code Playgroud)

swagger swagger-ui openapi

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

如何在注入代码中使用GM_xmlhttpRequest?

我正在编写一个注入网页的用户脚本.该脚本从Web服务器读取一些数据,我想将消息发送到侦听应用程序以对数据做出反应.

现在,我正在做的就是尝试将一个字符串命令发送到我的监听应用程序,看看我是否可以读取它.我的代码在注入之前工作,但之后我得到一个"未定义的引用错误".

我怀疑这与"Greasemonkey访问违规"有关.但是,我一直无法找到有效的解决方案.我正在开发Chrome.

这是我无法工作的代码部分.

GM_xmlhttpRequest({
   method: "POST", 
   url: "http://localhost:7777", 
   data: "testing123",
   headers:  {
         "Content-Type": "application/x-www-form-urlencoded"
             },
   onload: function(response) 
   {
      if (response.responseText.indexOf("TEST") > -1) 
      {
         console.log("Response confirmed..."); 
      }
   }
}); 
Run Code Online (Sandbox Code Playgroud)

我对脚本很新,所以也许我错过了一些明显的东西.如何在注入的代码中使用它?

javascript greasemonkey userscripts google-chrome-extension

8
推荐指数
1
解决办法
8952
查看次数

将TabControl ItemsSource绑定到ViewModels的集合

出于某种原因,我TabControl很难在绑定ItemsSourceObservableCollection视图模型时让我正确显示.我的设计基于这里的教程:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx.我确实在这里发现了一些像我这样的问题,但没有一个问题解决了我 这是我TabControl的xaml.

<TabControl ItemsSource="{Binding Workspaces}"
            SelectedIndex="{Binding ActiveWorkspaceIndex}"
            ItemTemplate="{StaticResource ClosableTabItemTemplate}"/>
Run Code Online (Sandbox Code Playgroud)

ClosableTabItemTemplate以下是哪里.

<DataTemplate x:Key="ClosableTabItemTemplate">
        <DockPanel Width="120">
          <Button 
              Command="{Binding Path=CloseCommand}"
              Content="X"
              Cursor="Hand"
              DockPanel.Dock="Right"
              Focusable="False"
              FontFamily="Courier" 
              FontSize="9"
              FontWeight="Bold"  
              Margin="0,1,0,0"
              Padding="0"
              VerticalContentAlignment="Bottom"
              Width="16" Height="16" 
              />
          <ContentPresenter 
              Content="{Binding Path=DisplayName}" 
              VerticalAlignment="Center" 
              />
        </DockPanel>
      </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

WorkspacesObservableCollection视图模型.ActiveWorkspaceIndex只是我在视图模型中跟踪的活动工作区索引.我通过App.xaml文件中的以下数据模板将我的视图模型与视图实例相关联.

<DataTemplate DataType="{x:Type vm:ViewModelStartPage}">
     <v:ViewStartPage/>
 </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

我只在我的工作空间集合中添加了一个视图模型.我看到选项卡控件中显示了2个视图,它们没有标签.这几乎就像TabControl不知道将不同的视图视为TabItems,它的行为更像堆栈面板,堆叠视图.如果我在代码中创建选项卡项,它可以正常工作:

System.Windows.Controls.TabItem i = new System.Windows.Controls.TabItem();
i.Content = new Views.ViewStartPage();
i.Header = "A Tab Item";
this.xTabControl.Items.Add(i); 
Run Code Online (Sandbox Code Playgroud)

我必须遗漏一些内容模板或其他东西.我将在稍后设置我的标签样式,但是现在我很乐意让基本标签工作.标签内容中的视图对于每个选项卡也可能不同,所以我不能使用我看到的所有地方的简单文本块TabControl模板示例...即使不是这样......

<TabControl.ContentTemplate>
    <DataTemplate> …
Run Code Online (Sandbox Code Playgroud)

wpf xaml binding tabcontrol

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

如何获取构造函数lambda的返回类型

我想知道是否有可能获得分配给构造函数的供应商的退货类型.

例如

Supplier<Foo> sFoo = Foo::new;
Run Code Online (Sandbox Code Playgroud)

我如何从供应商处获得"Foo.class"?我一直在使用typetools来解决其他问题.

这有效,例如:

Supplier<Foo> sFoo = () -> new Foo();
Class<?> fooClasss = net.jodah.typetools.TypeResolver.resolveRawArguments(Supplier.class, sFoo.getClass())[0];
// fooClass == Foo.class
Run Code Online (Sandbox Code Playgroud)

但是,如果我分配如下的供应商:Supplier<Foo> sFoo = Foo::new,则无法解析退货类型......

有什么想法吗?我没有必要使用typetools btw ...

java reflection lambda java-8 method-reference

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

从Windows客户端Mercurial和修改UNIX文件权限

我使用Mercurial处于一种特别独特的情况.我的小组正在开发运行嵌入式Linux的一些不同的硬件架构; 因此,我们在桌面Linux和PC上进行大部分代码开发,并在运行各种硬件架构的服务器上进行构建.

有一种情况是,使用Windows的人需要将所有更改都推送到mercurial服务器.但是,服务器和所有构建计算机都运行Linux,并期望某些类型的文件具有某些(UNIX)文件权限.

我的问题是:它是否可能并且是否有从PC修改UNIX文件权限的工具,或者在Mercurial中有一种方法可以在添加文件和推送更改时设置某种文件权限规则?

请注意,大多数PC用户使用TortoiseHG GUI或hg命令行界面.

谢谢!

mercurial file-permissions

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