小编Dav*_*ave的帖子

这个元素实例化方法叫做什么?

每当我在后面的代码中创建一个UIElement时,我会做这样的事情:

Button button = new Button();
button.Content = "Click Me!";
Run Code Online (Sandbox Code Playgroud)

但后来我在某处看到了这种语法,想知道它叫什么.我从来没有在任何.NET书籍中看到过它:

Button button = new Button { Content="Click Me!" };
Run Code Online (Sandbox Code Playgroud)

这显然很好,因为它简洁.所以我想我的问题是:

  1. 它叫什么?
  2. 以这种方式实例化UIElement有什么缺点吗?

我也很难找到设置CornerRadius和StrokeThickness等属性的正确方法,并认为#1的答案可能会帮助我进行更智能的搜索查询.

wpf element creation object instantiation

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

将MVVM应用于使用UserControls填充的ItemsControl

当我用当前的应用程序敲除越来越多的MVVM相关问题时,更多的只是不断涌现.:)

我想要替换的当前实现涉及StackPanel,其子项或多或少是动态生成的(通过查看配置文件).每个子节点都是UserControl的一个实例.之前,我所做的是为StackPanel分配一个名称,然后在Window_Loaded事件处理程序中,我只需确定必要的子项数,为每个子实例化一个UserControl,并为UserControl分配一个ID,这样我就知道了单击特定UserControl实例的按钮的正确来源; 每个UserControl上都有3个按钮.

所以我知道我想将StackPanel绑定到一个集合.这当然是不可能的,因为我需要使用从ItemsControl派生的东西,比如ListBox或ListView(甚至ItemsControl本身).为了在MVVM-ifying的第一次迭代中保持简单,我将只使用ListBox.

现在的问题是,我的代码隐藏中的ObservableCollection应该是一个ObservableCollection吗?我相信这意味着无论我如何为我的GUI设置外观,这个ListBox总是会有孩子看起来像他们在MyUserControl的XAML文件中那样.我希望这也可以自定义,但我认为这意味着我必须将MVVM模式应用于UserControl.

wpf mvvm itemssource

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

通过XML文件*和*代码配置log4net appender

我今天开始玩log4net,到目前为止,我真的很喜欢它.为了保留我们当前的日志记录功能,应用程序需要在应用程序启动时创建新的日志文件.日志文件名具有编码在其中的日期和时间戳.目前,我已经通过一个配置了log4net XmlConfigurator,这很好用,除了我的文件名RollingFileAppender在配置XML文件中是硬编码的.

我想继续使用XmlConfigurator,但是在调用之后Configure(),我希望得到RollingFileAppender和,在代码中,将其文件值更改为动态生成的字符串.网上的示例文档现在似乎已经关闭了,但是我已经深入研究了SDK参考,看起来我可以使用HeirarchyGetAppenders()做我需要做的事情.我是在正确的轨道上吗?

好的,我对此进行了尝试并尝试了以下代码,但这些代码无效:

private static readonly ILog _log = LogManager.GetLogger(typeof(GUI));
// in the config file, I've set the filename to example.log, and it works
XmlConfigurator.Configure(new FileInfo("log_config.xml"));
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
if(hierarchy != null) {
    // get the appenders
    IAppender[] appenders = hierarchy.GetAppenders();
    // change the filename for the RollingFileAppender
    foreach( IAppender a in appenders) {
        RollingFileAppender rfa = a as …
Run Code Online (Sandbox Code Playgroud)

log4net rollingfileappender appender log4net-configuration

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

如何从该类的数组中检索类成员的数组?

是的,措辞不好的问题,但我真的不确定如何说出来.:)

假设我有一个看起来像这样的简单类:

public class Contact
{
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有List<>他们中的一个.嗯,我想能够得到所有的列表NameS,就像Dictionary<T,U>让我这样做Dictionary.Keys.ToArray()Dictionary.Values.ToArray().目前,我正在做一件显而易见的事情,即循环遍历Contacts 数组并创建自己的Array.我可能天真,但我只是觉得可能有一种Dictionary方法可以在一行代码中获得它.

c# arrays

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

误解数据绑定基础和DataContexts - 长篇大论

我一直在几个简单的情况下使用数据绑定,取得了相当不错的成功.通常我只使用INotifyPropertyChanged来启用我的代码隐藏来修改屏幕上的GUI值,而不是为所有内容实现依赖项属性.

我正在使用LED控件来了解有关用户控件中数据绑定的更多信息,并被迫使用依赖属性,因为VS2008告诉我必须这样做.我的应用程序很简单 - 我有一个窗口,显示几个LED控件,每个控件上面都有一个数字,可选择一个控件.LED应该可以使用默认颜色进行定义,以及更改状态.

我开始写一个LED控制器,看起来非常好.首先,我开始使用这样的代码:

LED.xaml

<UserControl x:Class="LEDControl.LED"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="Auto" Width="Auto">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <!-- LED portion -->
        <Ellipse Grid.Column="0" Margin="3" Height="{Binding LEDSize}" Width="{Binding LEDSize}" Fill="{Binding LEDColor}" StrokeThickness="2" Stroke="DarkGray" />
        <Ellipse Grid.Column="0" Margin="3" Height="{Binding LEDSize}" Width="{Binding LEDSize}">
            <Ellipse.Fill>
                <RadialGradientBrush GradientOrigin="0.5,1.0">
                    <RadialGradientBrush.RelativeTransform>
                        <TransformGroup>
                            <ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
                            <TranslateTransform X="0.02" Y="0.3"/>
                        </TransformGroup>
                    </RadialGradientBrush.RelativeTransform>
                    <GradientStop Offset="1" Color="#00000000"/>
                    <GradientStop Offset="0.4" Color="#FFFFFFFF"/>
                </RadialGradientBrush>
            </Ellipse.Fill>
        </Ellipse>
        <!-- label -->
        <TextBlock Grid.Column="1" Margin="3" VerticalAlignment="Center" Text="{Binding LEDLabel}" />
    </Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

这样可以很好地吸收LED.然后,我将LEDSize,LEDLabel和LEDColor绑定到Ellipse属性,方法是this.DataContext …

c# data-binding wpf datacontext .net-3.5

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

MSBuild FileUpdate目标的ReplacementText字符串中的双引号有问题

我在解决如何FileUpdateReplacementText属性中的MSBuild 目标中正确转义双引号时遇到问题。

我想做的很简单。我想搜索AssemblyFileVersion("1.0.0.0")并替换为AssemblyFileVersion("1.0.0.<revision number here>")。我正在使用一个FileUpdate看起来像这样的元素:

<FileUpdate Files="Properties\AssemblyInfo.cs" Regex="AssemblyFileVersion(\(\x22)(\d+)\.(\d+)\.(\d+)\.(\d+)" ReplacementText="AssemblyFileVersion$1$2.$3.$4.$(build_vcs_number_1)" />
Run Code Online (Sandbox Code Playgroud)

这可以正常工作,但是看起来确实很奇怪!基本上,由于我无法在ReplacementText属性中使用双引号,因此我必须将Regex字符串中的“分组,然后使用组号将”插入ReplacementText(实际上,我将(和”,但我只需要对“)进行分组。

我已经尝试了所有标准方法-\“,”,\ x22,\ x22,\“,但没有任何效果。我必须在这里遗漏一些明显的东西,但这是什么?

尴尬...

regex msbuild .net-4.0 visual-studio-2010

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

使用PowerShell脚本替换DLL版本信息中的内部版本号

我是PowerShell的新手,这似乎是一种合理的方法来替换我的DLL中的构建号(通过修改.rc文件)和我的SVN存储库中的版本号.

使用PowerShell ISE,我创建了以下变量:

$1 = "123"
$revision = "230"
Run Code Online (Sandbox Code Playgroud)

现在,我正在使用以下命令测试我的字符串替换,以查看它与我在线阅读的行为方式.我期待找到能让我回复文件版本的东西12,3,0,230:

$pattern = '(^\s*FILEVERSION\s*[0-9]+,[0-9]+,[0-9]+,)[0-9]+$'

' FILEVERSION 12,3,0,0' -replace $pattern, "`$1"
# returns " FILEVERSION 12,3,0,"

' FILEVERSION 12,3,0,0' -replace $pattern, "$1"
# returns "123"

' FILEVERSION 12,3,0,0' -replace $pattern, '$1'
# returns " FILEVERSION 12,3,0,"

' FILEVERSION 12,3,0,0' -replace $pattern, "`$1$revision"
# returns "$1230"

' FILEVERSION 12,3,0,0' -replace $pattern, "`$1`$revision"
# returns " FILEVERSION 12,3,0,$revision"

' FILEVERSION 12,3,0,0' -replace $pattern, "$revision`$1"
# returns "230 FILEVERSION 12,3,0,"
Run Code Online (Sandbox Code Playgroud)

我对尝试4和6的结果感到惊讶.尝试4,为什么PowerShell不能替换$revision为"230"?还有尝试6,为什么它在以前会被正确替换 …

powershell powershell-2.0

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

无需"持久性服务"即可管理工作流生命周期

我现在正在使用Windows WF来简单地说明状态机.事实上,我甚至没有使用状态机,我正在使用顺序工作流程.最终,我会抛弃WF而不是其他东西,但由于我已经有了代码,我需要让Abort,Suspend和Resume方法正常工作.

我的应用程序生成一个线程,然后生成另一个拥有WorkflowInstance的线程.我的GUI中有Abort,Pause和Resume按钮,它们最终分别调用WorkflowInstance的Abort,Suspend和Resume方法.

问题是当我这样做时,我得到一个非常大且可怕的MessageBox,它说:

工作流托管环境没有工作流实例上的操作所需的持久性服务

以及一个很好的堆栈跟踪和所有.现在,我在Bruce Bukovics的Pro WF中查找了这些方法,他的一个例子称这些方法,并没有提到"持久性服务".但是,他的示例调用属于WorkflowRuntime的范围,即他将它们调用为:

using(WorkflowRuntimeManager manager = new WorkflowRuntimeManager(new WorkflowRuntime("WorkflowRuntime")))
{
  manager.WorkflowRuntime.StartRuntime();
  WorkflowInstanceWrapper instance = manager.StartWorkflow(typeof(SharedWorkflows.Workflow1), null);
  instance.Suspend("Manually suspended");
  instance.Resume();
  waitHandle.WaitOne();
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我将WorkflowRuntime实现为单例,因为我发现在创建像这样的WorkflowRuntime时存在巨大的内存泄漏.所以我的代码看起来像这样:

WorkflowInstance instance = WorkflowRuntimeSingleton.Instance.workflow_runtime.CreateWorkflow(typeof(SharedWorkflows.Workflow1), null);
instance.Start();
instance.Suspend("Manually suspended");
instance.Resume();
waitHandle.WaitOne();
Run Code Online (Sandbox Code Playgroud)

现在,如果我如上所示调用Suspend and Resume,它可以正常工作.但是,如果我通过GUI发出调用,它会抱怨持久性服务.

鉴于这些信息,并且我不想仅仅为了获得这三个功能而建立数据库,我想知道我需要做些什么来使这项工作.我最好的猜测是,WF不喜欢从一个单独的线程控制.如果是这种情况,是否有一种好方法可以使调用看起来好像是从同一个线程发出的?

以下是我提出的一些可能的解决方案,但我确信这里的某个人有更好的方式来做到这一点.

  1. WF通过GUI界面查询中止/暂停/恢复(看起来真的很蹩脚)
  2. 用WaitAny()替换WaitOne(),并将GUI调用到拥有工作流的对象中设置AutoResetEvent.WaitAny()允许继续执行,然后我的代码可以检查用户按下哪个按钮.这需要包装在一个循环中,以便我们可以再次等待,直到用户单击Abort,或直到WF完成.
  3. 使用布尔标志基本上做#2正在做的事情.
  4. 看看SO上是否有人知道如何让电话神奇地进入正确的线程:)

任何见解或意见将非常感谢!

.net workflow workflow-foundation

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

部署使用NUnit进行单元测试的应用程序

我希望很快就会部署一个应用程序,我觉得很奇怪我必须包含nunit.framework.dll.毕竟,用户不需要运行单元测试!所以我唯一能想到的是有一些方法可以为Debug和Release配置我的解决方案,这样Debug就会引用NUnit,而Release则不会.在VS200之前我从未见过这样的东西.这里的其他人做了什么来排除将NUnit框架与您的应用一起部署的需要?

deployment nunit nunit-2.5 .net-3.5

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

在包装到扩展方法后,LINQ语句不再有效

我需要一个可以采用字符串集合的方法,并将所有特定字符串替换为另一个字符串.

例如,如果我有一个List<string>如下所示:

List<string> strings = new List<string> { "a", "b", "delete", "c", "d", "delete" };
Run Code Online (Sandbox Code Playgroud)

我想用""替换"删除",我会使用这个LINQ语句:

strings = (from s in strings select (s=="delete" ? s=String.Empty : s)).ToList();
Run Code Online (Sandbox Code Playgroud)

它很棒.但后来我想我应该把它作为一种扩展方法,因为我以后可能会再次使用它.在这种情况下,我只想写下面的内容:

strings.ReplaceStringInListWithAnother( "delete", String.Empty);
Run Code Online (Sandbox Code Playgroud)

当我的代码编译,并且LINQ语句在扩展方法内部工作时,当我返回时,集合恢复为其原始内容:

public static void ReplaceStringInListWithAnother( this List<string> my_list, string to_replace, string replace_with)
{
    my_list = (from s in my_list select (s==to_replace ? s=replace_with : s)).ToList();
}
Run Code Online (Sandbox Code Playgroud)

所以看起来我只是修改了List的副本......但是当我查看Pop的代码时,它同样修改了集合,但更改仍然存在,所以我的假设是我的方法的参数声明是正确的.

谁能解释我在这里做错了什么?

c# linq extension-methods .net-3.5

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

“手动”滚动 log4net RollingFileAppender 日志文件?

我希望能够调用像“ResetLog”这样的方法,将我的“log.txt”复制到“log.txt.1”,然后清除log.txt,而不是在日期/时间或指定的最大大小之后滚动日志。

我尝试通过使用 FileAppender 而不是 RollingFileAppender 执行类似的操作来实现这一点:

var appenders = log4net.LogManager.GetRepository().GetAppenders();
foreach (var appender in appenders) {
    var fa = appender as log4net.Appender.FileAppender;
    if (fa != null) {
        string logfile = fa.File;
        fa.Close();
        string new_file_path = CreateNextLogFile(logfile);
        fa.File = new_file_path;
        fa.ActivateOptions();
    }
}            
Run Code Online (Sandbox Code Playgroud)

文件被关闭,并且 CreateNextLogFile() 对其进行重命名。然后,我创建一个新的日志文件并设置 FileAppender 来使用它。但是,我认为 ActivateOptions 会继续并使用所需的设置重新配置 FileAppender。我查看了 log4net 文档,没有看到任何其他公共方法允许我在关闭 FileAppender 后重新打开它。谁能推荐一种实现滚动的方法?如果 RollingFileAppender 有这样的东西那就太好了,但我也没有在它的文档中看到任何有用的东西。

log4net rollingfileappender fileappender

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

寻找有关差异问题的解释

......毕竟,这可能实际上不是一个方差问题.当我编译我的代码时,Visual Studio会给我以下错误:

无法确定条件表达式的类型,因为'ClassA'和'ClassB'之间没有隐式转换

我在这里读到了这个错误,并且确实听起来像是不可能将抽象类用作接口之类的契约,我可以使用派生类代替它们的基类.为了简化操作,我编写了一些模拟我实际代码关系的测试类.请考虑以下事项:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractClassImplicitConversion {
    class Program {
        static void Main(string[] args) {
            StartClass temp = new StartClass();
        }
    }

    public class StartClass
    {
        public AbstractClass _ac { get; private set; }

        public StartClass()
        {
            bool which = true;
            // this block will compile
            /*
            if( which)
                _ac = new DerivedClass1();
            else 
                _ac = new DerivedClass2();
             */
            // this block will not compile
            _ac = which ? new …
Run Code Online (Sandbox Code Playgroud)

c# covariance variance

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

使用INotifyPropertyChanged而不是DependencyProperties进行数据绑定

我一直在努力让数据绑定在WPF中工作一周多一点.我在这里得到了关于DataContext的宝贵帮助,我确实通过DependencyProperties获得了数据绑定.在我学习数据绑定的同时,我INotifyPropertyChanged在很多方面遇到了很多关于它以及如何比DP更好的讨论.我想我会试一试并尝试一下.

我正在使用Josh Smith的基础ViewModel类,我的ViewModel是从它派生的.但是,我在使数据绑定工作时遇到了一些麻烦,我希望有人可以告诉我哪里出错了.

在我的ViewModel类中,我有一个ObservableCollection<string>.在我的GUI中,我有一个与此OC绑定的组合框,即

<ComboBox ItemsSource="{Binding PluginNames}" />
Run Code Online (Sandbox Code Playgroud)

GUI的DataContext设置为ViewModel,即

private ViewModel _vm;

public GUI()
{
  InitializeComponent();
  _vm = new ViewModel();
  this.DataContext = _vm;
}
Run Code Online (Sandbox Code Playgroud)

并且ViewModel的OC名为"PluginNames":

public class ViewModel
{
  public ObservableCollection<string> PluginNames;  // this gets instantiated and added to elsewhere
}
Run Code Online (Sandbox Code Playgroud)

加载GUI时,会调用一个实例化OC并将插件名称添加到其中的方法.OC被修改后,我打电话给RaisePropertyChanged( "PluginNames").我期待由于WPF数据绑定模型认识到INotifyPropertyChanged,这就是我需要做的所有事情,它将"神奇地工作"并使用已加载的插件更新组合框项目......但事实并非如此.

有谁可以指出我在这里做错了什么?谢谢!

更新:我不知道为什么,但现在没有做任何明显的更新,它根本没有找到属性.我想我真的很傻,错过了某个重要的一步.

wpf dependency-properties mvvm inotifypropertychanged

0
推荐指数
1
解决办法
570
查看次数