每当我在后面的代码中创建一个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)
这显然很好,因为它简洁.所以我想我的问题是:
我也很难找到设置CornerRadius和StrokeThickness等属性的正确方法,并认为#1的答案可能会帮助我进行更智能的搜索查询.
当我用当前的应用程序敲除越来越多的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.
我今天开始玩log4net,到目前为止,我真的很喜欢它.为了保留我们当前的日志记录功能,应用程序需要在应用程序启动时创建新的日志文件.日志文件名具有编码在其中的日期和时间戳.目前,我已经通过一个配置了log4net XmlConfigurator,这很好用,除了我的文件名RollingFileAppender在配置XML文件中是硬编码的.
我想继续使用XmlConfigurator,但是在调用之后Configure(),我希望得到RollingFileAppender和,在代码中,将其文件值更改为动态生成的字符串.网上的示例文档现在似乎已经关闭了,但是我已经深入研究了SDK参考,看起来我可以使用Heirarchy和GetAppenders()做我需要做的事情.我是在正确的轨道上吗?
好的,我对此进行了尝试并尝试了以下代码,但这些代码无效:
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) 是的,措辞不好的问题,但我真的不确定如何说出来.:)
假设我有一个看起来像这样的简单类:
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方法可以在一行代码中获得它.
我一直在几个简单的情况下使用数据绑定,取得了相当不错的成功.通常我只使用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 …
我在解决如何FileUpdate在ReplacementText属性中的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,\“,但没有任何效果。我必须在这里遗漏一些明显的东西,但这是什么?
尴尬...
我是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,为什么它在以前会被正确替换 …
我现在正在使用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不喜欢从一个单独的线程控制.如果是这种情况,是否有一种好方法可以使调用看起来好像是从同一个线程发出的?
以下是我提出的一些可能的解决方案,但我确信这里的某个人有更好的方式来做到这一点.
任何见解或意见将非常感谢!
我希望很快就会部署一个应用程序,我觉得很奇怪我必须包含nunit.framework.dll.毕竟,用户不需要运行单元测试!所以我唯一能想到的是有一些方法可以为Debug和Release配置我的解决方案,这样Debug就会引用NUnit,而Release则不会.在VS200之前我从未见过这样的东西.这里的其他人做了什么来排除将NUnit框架与您的应用一起部署的需要?
我需要一个可以采用字符串集合的方法,并将所有特定字符串替换为另一个字符串.
例如,如果我有一个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的代码时,它同样修改了集合,但更改仍然存在,所以我的假设是我的方法的参数声明是正确的.
谁能解释我在这里做错了什么?
我希望能够调用像“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 有这样的东西那就太好了,但我也没有在它的文档中看到任何有用的东西。
......毕竟,这可能实际上不是一个方差问题.当我编译我的代码时,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) 我一直在努力让数据绑定在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,这就是我需要做的所有事情,它将"神奇地工作"并使用已加载的插件更新组合框项目......但事实并非如此.
有谁可以指出我在这里做错了什么?谢谢!
更新:我不知道为什么,但现在没有做任何明显的更新,它根本没有找到属性.我想我真的很傻,错过了某个重要的一步.
c# ×4
wpf ×4
.net-3.5 ×3
log4net ×2
mvvm ×2
.net ×1
.net-4.0 ×1
appender ×1
arrays ×1
covariance ×1
creation ×1
data-binding ×1
datacontext ×1
deployment ×1
element ×1
fileappender ×1
itemssource ×1
linq ×1
msbuild ×1
nunit ×1
nunit-2.5 ×1
object ×1
powershell ×1
regex ×1
variance ×1
workflow ×1