当应用程序启动时,我希望我的WPF窗口自动捕捉到屏幕的右边缘.有没有办法做到这一点?我也想保留它的尺寸.因此,与将窗口拖动到屏幕边缘时发生的捕捉行为不同,导致窗口调整大小到屏幕的一部分或全屏,我希望我的窗口只是捕捉到某个位置的边缘默认情况下或之后由用户拖动到特定位置,而不调整大小.我仍然希望保留用户将窗口拖离边缘的能力.
有没有已经实现过的东西,还是我必须创建自己的行为模式?我尝试了很多搜索关键字组合,但找不到类似于我正在做的事情.一些搜索包括禁用捕捉行为或提供捕捉行为,但没有像我上面描述的那样.
编辑:
我找不到一个现成的解决方案,所以我写了自己的解决方案.这个解决方案基于BenVlodgi的建议,所以我感谢他帮助我.这是一个非常粗略的实现,仍然需要大量的抛光和更好的代码技术,但它的工作原理,它是任何想要尝试这个的人的良好基础.它非常简单,与WPF配合得非常好.这个实现的唯一限制是我还没有尝试过它可以使用两个屏幕,但它非常简单(我只是没有时间用它而且我现在不需要那个功能) .所以,这是代码,我希望它可以帮助那里的人:
public partial class MainWindow : Window
{
// Get the working area of the screen. It excludes any dockings or toolbars, which
// is exactly what we want.
private System.Drawing.Rectangle screen =
System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
// This will be the flag for the automatic positioning.
private bool dragging = false;
// The usual initialization routine
public MainWindow()
{
InitializeComponent();
}
// Wait until window is lodaded, but prior to being rendered to set position. This
// is …Run Code Online (Sandbox Code Playgroud) 我在问一个问题,就是要求输入一个只包含四位数的帐号.这必须使用基本的初学者C++来完成.
我需要找出一种方法来将整数的输入限制为四位数.用户应该能够输入0043或9023或0001,它应该是可接受的值....
我想我知道如何使用字符串.... getline(cin,input)完成它然后检查input.length()== 4?
但是我不知道我怎么会用整数输入做这个.
我有一个二进制文件,将作为字符读入.其他人将每个角色移位到左侧未知次数(假设有包裹).我希望能够读入每个角色,然后将换档换到右侧(换档的次数我想必须手动计算出来,因为我还没想出另一种方法).
所以,我目前的想法是我读了一个字符,用temp创建一个副本然后使用XOR:
char letter; //will hold the read in letter
char temp; //will hold a copy of the letter
while(file.read(&letter, sizeof(letter)) //letter now holds 00001101
{
temp = letter; //temp now holds 00001101
letter >>= 1; //shift 1 position to the right, letter now holds 00000110
temp <<= 7; //shift to the left by (8-1), which is 7, temp now holds 10000000
letter ^= temp; //use XOR to get the wrap, letter now holds 10000110
cout << letter;
}
Run Code Online (Sandbox Code Playgroud)
这在我筋疲力尽的头脑中是有道理的,但它不起作用......我无法弄清楚为什么.char的大小是1个字节,所以我想我只需要乱用8位. …
所以,我的许多 WPF 应用程序都遇到了一个问题,在关闭窗口的子窗口后,该窗口(通常是我的主窗口)将进入后台,在我打开的任何其他窗口之后。经过一番研究,我发现这个提交给微软的错误报告:错误报告和他们通常的回应“WPF 团队最近审查了这个问题,不会解决它......”
有没有人成功地解决了这个问题?它让我发疯,我想不出解决办法。
编辑:
我考虑了詹姆斯在他的回答中所推荐的内容,并且在几乎驳回了他的建议之后,由于窗户位于其他一切之上的不便性,我想出了这个:
ChildWindow.Closed += delegate
{
ChildWindow = null;
this.Topmost = true;
System.Threading.Thread.Sleep(1000);
this.Topmost = false;
};
Run Code Online (Sandbox Code Playgroud)
因此,当Closed()引发孩子的事件时,我确保父窗口是最顶层的。然后,我让线程休眠 1 秒并将 topmost 设置为 false 以允许其他窗口覆盖此父窗口。
暂停的原因:如果我不使用暂停而只是this.Topmost = true跟在后面this.Topmost = false,那么效果永远不会发生,并且由于错误的时间安排,错误仍然会发生。
我不确定这是否是最好的方法,但它有效。微软需要在 WPF 上投入更多资源。
var a = ImmutableList<int>.Empty.Add(1).Add(2).Add(3);
var b = ImmutableList<int>.Empty.Add(1).Add(2).Add(3);
Console.WriteLine(a.Equals(b)); // False
Run Code Online (Sandbox Code Playgroud)
在上面的代码a.Equals(b)调用中Object.Equals,因为ImmutableList<T>没有覆盖Equals(object),并且ImmutableList<T>引用类型Object.Equals会(无用的)引用比较。
问题:为什么不ImmutableList<T>覆盖.Equals?将每个包含的对象与每个包含的对象进行比较.Equals并根据这些比较返回结果将是直接的并且期望。测试框架的其余部分甚至是一致的(请参阅 参考资料class String)
注意:上面的代码是用 System.Collections.Immutable.1.1.38-beta-23516
我有一些非常基本的DataGrid测试数据.该数据被提供为ObservableCollection<T>的Client objects,其含有Organization,FirstName和LastName特性.由我组项目Organization,并希望能够进行排序FirstName和LastName特定群体内(此部分功能正常),并自行排序组Organization.最后一部分是我遇到的问题.
如果我没有指定任何排序属性或者我在CollectionViewSource.SortDescriptions(见下文)中指定了一个属性,例如PropertyName="Name"or PropertyName="CompleteNonsense",除了之外PropertyName="Organization",它将让我进行初始排序.如果您查看下面的图像,公司名称将无序显示,因为这是集合的初始化方式.如果我点击Organization标题,它会按升序排序,但不会让我在那之后再进行排序.如果我再次单击标题,它将更改箭头,这表示排序方向,但不会发生实际排序.无论我指定什么排序属性,这都是相同的...即使是完全任意的属性,除非是PropertyName="Organization",或者没有指定属性.
如果我指定排序PropertyName="Organization",它将按升序排序,但如果单击标题则不会排序.因此,似乎该属性名称确实触发排序,但仅限第一次.
截图:

这是XAML为了DataGrid:
<DataGrid ItemsSource="{Binding Source={StaticResource GroupedData}}"
AutoGenerateColumns="False" IsReadOnly="True"
GridLinesVisibility="None" HeadersVisibility="Column"
CanUserAddRows="False" CanUserDeleteRows="False"
CanUserResizeRows="False" Background="White">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="0"/>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Margin" Value="10,0,0,0"/>
</Style>
</DataGrid.RowStyle>
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<DockPanel Background="LightBlue" DataContext="{Binding Items}"> …Run Code Online (Sandbox Code Playgroud) 已解决: 请使用XAML代码,屏幕截图和说明查看下面我自己的答案.
标题这一点有点难,所以让我解释一下我的问题.我有一个具有已定义高度的数据网格,因此会出现滚动条.我想将垂直滚动条包含到排除标题的区域.虽然它只滚动数据行而不是标题,但在视觉上它覆盖了右边的整个数据网格区域.问题在于滚动条区域出现两个框(一个在上方和下方).我不知道如何摆脱它们或如何将滚动条包含到datagrid的主体.

我唯一能够弄清楚的(我不喜欢它的外观)是将DataGrid的背景设置为透明.结果如下:

如你所见,滚动条令人讨厌.然后,如果背景是透明的,那么水平滚动条和最后一行之间也存在间隙的问题:

还有一个解决方案可以摆脱这两个盒子的数据网格的背景颜色,使它们更加突出:
类似的解决方案可以在这里找到: 恼人的广场滚动条相遇
但是,它并没有摆脱滚动条在侧面笨拙地伸出的问题.
我测试的是将标题与主体分开并将主体放入垂直ScrollViewer,然后将标题和主体放入水平ScrollViewer中,以便它们可以水平滚动.但是,正如您想象的那样,这不会很好,因为您必须向右滚动才能看到verticall滚动条.我确信有一种方法可以使它在右边保持冻结状态,但我还没弄明白.另一个问题是标题宽度必须与该列中任何单元格的最大可能宽度匹配,或者所有内容都将关闭.这是向右滚动时显示的结果:

我是新手来控制模板,所以我无法弄清楚这是否可行,因为我找不到合适的组件:
如果我给垂直滚动条左边的一个负边距(比如-6,0,0,0)和一个类似大小的填充到单元格块的右边(0,0,6,0),垂直滚动条在技术上应该向左移动.我将继续尝试并尝试解决这个问题,除非有人为我提供答案(这将是非常棒的).
编辑#1:
好吧,我取得了一些进展,并能够将滚动条的边距设置为(-17,0,0,0).17似乎是滚动条的宽度.它的宽度似乎有一个特定的键:
但我无法想出一种方法将其作为XAML中边距的负偏移值插入.在代码隐藏中做这件事并不难......但我宁愿把它全部保留在XAML中.无论如何,这里是进度的截图和XAML代码部分:

这是XAML代码部分:
<Style TargetType="{x:Type DataGrid}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGrid}">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
<ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" …Run Code Online (Sandbox Code Playgroud) 我有一个类(用于测试目的的代码很少),它包含一个静态的ObservableCollection,从其他地方填充:
public class TestClass
{
public static ObservableCollection<int> TestCollection = new ObservableCollection<int>();
}
Run Code Online (Sandbox Code Playgroud)
...和一个基本的WPF窗口,其中包含ListBox:
<Window x:Class="app.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox x:Name="list"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
当我尝试以编程方式绑定时:
list.ItemsSource = Containers.TestClass.TestCollection;
Run Code Online (Sandbox Code Playgroud)
......工作得很好.但是,当我尝试通过XAML执行绑定时:
<Window x:Class="app.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="clr-namespace:app.Containers"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<d:TestClass x:Key="dataSource"/>
</Window.Resources>
<Grid>
<ListBox x:Name="list" ItemsSource="{Binding Source={StaticResource dataSource}, Path=TestCollection}"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
......什么都没有显示出来
我也尝试过设置DataContext:
<Window.Resources>
<l:LifeEngine x:Key="dataSource"/>
</Window.Resources>
<Window.DataContext>
<Binding Source="{StaticResource dataSource}"/>
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)
......并使用路径......
......没有任何东西再次显示出来.
另外,不确定它是否重要,但是当我上课时static,我的XAML代码中出现错误:
类型'TestClass'是抽象的,必须包含显式值.
所以,这是不可能的.
知道如何ObservableCollection通过XAML 绑定它吗?
我是初学程序员,我一直在使用C#中的WPF来制作程序.我最近读过,你可以为浏览器制作WPF应用,所以我下载了.net 5,但我仍然无法制作它们.当我在visual studio community 2015中选择新项目时,它只显示WPF而不显示WPF浏览器.如果有人知道如何获得它,那么请告诉我.谢谢!
我有一个列表框:
<ListBox x:Name="lbxAF" temsSource="{Binding}">
Run Code Online (Sandbox Code Playgroud)
从这个修改过的Observable Collection中获取数据:
public ObservableCollectionEx<FileItem> folder = new ObservableCollectionEx<FileItem>();
Run Code Online (Sandbox Code Playgroud)
这是在使用FileSystemWatcher监视特定文件夹以添加,删除和修改文件的类中创建的.
ObservableCollection被修改了(因此最后是Ex),所以我可以从外部线程修改它(代码不是我的,我实际上通过这个网站搜索并发现它,就像一个魅力):
// This is an ObservableCollection extension
public class ObservableCollectionEx<T> : ObservableCollection<T>
{
// Override the vent so this class can access it
public override event System.Collections.Specialized.NotifyCollectionChangedEventHandler CollectionChanged;
protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
using (BlockReentrancy())
{
System.Collections.Specialized.NotifyCollectionChangedEventHandler eventHanlder = CollectionChanged;
if (eventHanlder == null)
return;
Delegate[] delegates = eventHanlder.GetInvocationList();
// Go through the invocation list
foreach (System.Collections.Specialized.NotifyCollectionChangedEventHandler handler in delegates)
{
DispatcherObject dispatcherObject = handler.Target as …Run Code Online (Sandbox Code Playgroud)