我正在为Windows WPF应用程序添加一个Addon.因此,我可以通过编程访问ListView,但不能编辑WPF源.
要ListViewItem根据数据添加特殊格式,我创建了自己的StyleSelector类,并将其实例分配给ListView ItemContainerStyleSelector属性.
这是来源:
public class MySelector extends System.Windows.Controls.StyleSelector {
private var oldSelector : System.Windows.Controls.StyleSelector;
public function MySelector(oldSelector : StyleSelector, debug : Object) {
this.oldSelector = oldSelector;
}
public function SelectStyle(item : Object, container : DependencyObject) : Style {
if (this.oldSelector != null) {
var oldStyle : System.Windows.Style = this.oldSelector.SelectStyle(item, container);
if (item[3] == "3") {
var newStyle : System.Windows.Style = new System.Windows.Style(oldStyle.TargetType, oldStyle);
newStyle.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Red));
return newStyle;
} else {
return oldStyle; …Run Code Online (Sandbox Code Playgroud) 我已经使用了BackgroundWorkerandTask在后台做了一些事情,然后将其发布回用户界面。我什至使用BackgroundWorkerandReportProgress和一个无限循环(除了取消)来不断地将内容发布到 UI 线程。
但这次我需要一个更可控的场景:后台线程不断轮询其他系统。使用Invoke它可以发送 UI 更新。但是UI如何向后台线程发送消息呢?就像更改设置一样。
事实上,我要求最好的 .NET 实践来拥有具有以下细节的工作线程:
Invoke, Dispatch)在我的场景中,我仍然使用 WinForms,但我想这应该不重要?稍后我会将应用程序转换为 WPF。
您建议采用哪种最佳实践?
我有一个在Team Services中托管并使用其构建服务的解决方案.
该解决方案还包括使用WiX工具集构建MSI文件的项目.这在本地工作得很好,我已经将工具集二进制文件集成到存储库中,以便在构建服务器上启用它,如本指南中所述.
但构建过程报告项目无法构建:
light.exe(0,0)执行ICE操作'ICE01'时出错.这种ICE故障的最常见原因是错误注册的脚本引擎.有关 详细信息以及如何解决此问题,请参见http://wixtoolset.org/documentation/error217/.外部UI消息记录器不期望以下字符串格式:"无法访问Windows Installer服务.如果未正确安装Windows Installer,则会发生这种情况.请联系您的支持人员以获取帮助."
这从ICE01到ICE07重复,然后是:
light.exe(0,0)发生错误代码0x643的意外Win32异常:操作 - 'ICE09'安装期间发生致命错误
我也试图压制这个SO问题中提到的验证.这基本上是关于将以下内容添加到wix项目文件中:
<PropertyGroup>
<SuppressValidation>true</SuppressValidation>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
这是有效的 - 但如果这是最好的方式,我会很好,因为它感觉不太对劲.在Visual Studio Team Services中运行WiX的正确方法是什么?
我有一个 Aurelia TypeScript 项目,其中我编译的 JavaScript 文件进入.../wwwroot子文件夹,原始打字稿文件位于.../src. 我试图使用VS代码在Chrome扩展调试断点,但不打,当我打开diagnosticLogging中launch.json的映射的源是不正确:它看在.../wwwroot/src/file.ts来代替.../src/file.ts。
我试图解决这个问题,sourceMapPathOverrides但没有成功。看来我无法匹配我的 sourceRoot。
我试过这个:
"webRoot": "${workspaceRoot}/wwwroot",
"sourceMapPathOverrides": {
"/src/*": "${workspaceRoot}/src/*"
},
Run Code Online (Sandbox Code Playgroud)
这是用于查找源的调试控制台输出login.js:
›SourceMaps.loadSourceMapContents: Reading local sourcemap file from ...\wwwroot\dist\login.js.map
›SourceMap: creating for ...\wwwroot\dist\login.js
›SourceMap: sourceRoot: /src
›SourceMap: sources: ["login.ts"]
›SourceMap: webRoot: .../wwwroot
›SourceMap: resolved sourceRoot /src -> ...\wwwroot\src
›SourceMaps.scriptParsed: ...\wwwroot\dist\login.js was just loaded and has mapped sources: ["...\\wwwroot\\src\\login.ts"]
Run Code Online (Sandbox Code Playgroud)
注意:三个点...代表我在磁盘上删除的项目根目录路径。
我如何使用sourceMapPathOverrides有它查找login.ts的.../src/? …
有没有一种方法可以将具有自定义属性的自定义HTML元素添加到VS Code,这样我就可以获得一些自动完成/智能感知功能?
例如,在我的框架(此处为Aurelia)中,我添加了一个,<my-component is-telling-lies="true" aria-type="hidden" default-target="north">Do you believe?</my-component>并希望在开始键入新元素时显示该元素,并在其中键入元素的属性空间时在其中显示属性。
当我为ASP.NET Core应用程序创建webhost时,我可以指定Startup类而不是实例.
您自己的Startup类的构造函数可以获取通过DI提供的参数.我知道如何为DI注册服务,ConfigureServices但因为那是该类的成员,这些服务不适用于我的启动类的构造函数.
如何注册可用作Startup类的构造函数参数的服务?
原因是我必须提供一个必须在创建webhost之前/之前创建的对象实例,并且我不想以类似全局的样式传递它.
创建IWebHost的代码:
this.host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseIISIntegration()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<WebStartup>()
log.Debug("Run webhost");
this.host.Start();
Run Code Online (Sandbox Code Playgroud)
构造函数WebStartup:
public WebStartup(IHostingEnvironment env, MyClass myClass)
{
var config = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddEnvironmentVariables()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.Build();
...
}
Run Code Online (Sandbox Code Playgroud)
那么具体如何我注册MyClass在这个例子中(这显然必须在之前完成WebStartup由实例化IWebHost)?
我正在尝试记录WebRTC传输的音频PeerConnection MediaStream。我在实现的音轨中添加了一个接收器AudioTrackSinkInterface。它实现了以下OnData方法:
void TestAudioTrackSink::OnData(const void* audio_data, int bits_per_sample, int sample_rate, size_t number_of_channels, size_t number_of_frames) {
size_t valueCount = number_of_channels * number_of_frames;
int16_t *_data = (int16_t*)audio_data;
f.write((char*)&_data, sizeof(int16_t) * valueCount);
f.flush();
}
Run Code Online (Sandbox Code Playgroud)
f是一个ofstream。每个样本的位数为16,采样率为 16000,通道为1,帧为160。
但是,当我使用AudaCity原始导入(带符号的16位PCM,小字节序,单声道,采样率16000)打开创建的文件时,我听不到有意义的音频。
如何正确写原始音频日期?
我运行了WPF验证(添加ValidationRules到绑定中),使用模板我可以创建漂亮的装饰器.那里有很多帖子.
但我找不到一种方法来在一个固定的位置(如TextBlock窗口的一角)中显示装饰控件之外的错误消息,例如
我怎么能实现这个目标?我可以将所有验证错误消息绑定到我的DataContext(ViewModel)吗?
更新:感谢答案我得到了部分工作.验证消息现在显示在另一个标签中.由于所有带有验证规则的文本框都是通过代码动态创建的,因此以这种方式完成绑定:
Binding bindSite = new Binding();
bindSite.Source = this.validationErrorDisplayLabel;
BindingOperations.SetBinding(textBox, Validation.ValidationAdornerSiteProperty, bindSite);
Run Code Online (Sandbox Code Playgroud)
但验证消息仅转发到adornersite执行此代码的最后一个文本框.
我在这个小例子中重现了这个问题.
XAML:
<Grid>
<TextBox
Validation.ValidationAdornerSite="{Binding ElementName=ErrorDisplay}"
HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
<TextBox.Text>
<Binding>
<Binding.Path>Box1</Binding.Path>
<Binding.ValidationRules>
<local:RuleA />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBox
Validation.ValidationAdornerSite="{Binding ElementName=ErrorDisplay}"
HorizontalAlignment="Left" Height="23" Margin="10,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
<TextBox.Text>
<Binding>
<Binding.Path>Box2</Binding.Path>
<Binding.ValidationRules>
<local:RuleA />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<TextBlock
x:Name="ErrorDisplay"
Background="AntiqueWhite"
Foreground="Red"
Text="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.ValidationAdornerSiteFor).(Validation.Errors)[0].ErrorContent}"
HorizontalAlignment="Left" Margin="230,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" RenderTransformOrigin="2.218,-4.577" Width="177" Height="51"/> …Run Code Online (Sandbox Code Playgroud) 我得到了一个ItemsControl使用Canvasas 的项目ItemsPanel,它的项目根据绑定类型呈现为不同的 WPF 形状,基本上如下所示:
<ItemsControl ItemsSource="{Binding PreviewShapes}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:UiPreviewLineViewModel}">
<Line X1="{Binding Start.X}" Y1="{Binding Start.Y}"
X2="{Binding End.X}" Y2="{Binding End.Y}"
StrokeThickness="0.75" Stroke="{Binding Brush}" x:Name="Line" ToolTip="{Binding Text}">
</Line>
</DataTemplate>
<DataTemplate DataType="{x:Type local:UiPreviewEllipsisViewModel}">
<Ellipse Canvas.Left="{Binding UpperLeft.X" Canvas.Top="{Binding UpperLeft.Y}"
Width="{Binding Width}" Height="{Binding Height}"
StrokeThickness="0.75" Stroke="{Binding Brush}" x:Name="Ellipse" ToolTip="{Binding Text}">
</Ellipse>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="SketchCanvas" ClipToBounds="False">
</Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
因此,我基本上将对象添加到PreviewShapes视图模型中,并根据它们渲染到 WPFLine或Ellipses 的类型。这基本上可以工作,但附加的属性Canvas.Left和 …
ASP.NET core webhost 启动后,我想获取其绑定 URL(即“ http://0.0.0.0:5001 ”、“ https://192.168.42.42:8081 ”等)。所以在处理完所有配置内容后它绑定到的 URL。
我怎样才能做到这一点?
注意:我不处理请求。服务器应该只是记录它或将信息发送到其他地方。我找到了很多关于如何设置URL 的信息,但我想询问主机它绑定了什么,而不是询问配置它应该绑定什么。
c# ×4
wpf ×3
.net ×2
asp.net-core ×2
audio ×1
autocomplete ×1
azure-devops ×1
c++ ×1
datatemplate ×1
jscript.net ×1
listview ×1
mvvm ×1
source-maps ×1
validation ×1
webrtc ×1
windows ×1
wix ×1