我正在尝试在C#/ WPF中创建一个图表应用程序.我想要的有点类似于Microsoft Visio,虽然我不想克隆它.我正在编写这个问题,因为我正在编码,只是把我遇到的所有问题都放进去,以防有人发现它有用.也许我一直在想太难,但我觉得我可以呕吐键盘并生成更好的代码,所以请随意给出你抓到的每个细节的任何建议(语法排除:-))
简而言之:
为什么所有项目都位于(0,0)?
public class Diagram : MultiSelector
{
public Diagram()
{
this.CanSelectMultipleItems = true;
// The canvas supports absolute positioning
FrameworkElementFactory panel = new FrameworkElementFactory(typeof(Canvas));
this.ItemsPanel = new ItemsPanelTemplate(panel);
// Tells the container where to position the items
this.ItemContainerStyle = new Style();
this.ItemContainerStyle.Setters.Add(new Setter(Canvas.LeftProperty, new Binding("X")));
this.ItemContainerStyle.Setters.Add(new Setter(Canvas.TopProperty, new Binding("Y")));
}
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
FrameworkElement contentitem = element as FrameworkElement;
Binding leftBinding = new Binding("X");
Binding topBinding = new Binding("Y");
contentitem.SetBinding(Canvas.LeftProperty, …Run Code Online (Sandbox Code Playgroud) 我已经搜索了高低的解决方案,但我似乎没有找到它的底部.像网上的很多帖子我似乎没有让我的itemPropertyChanged工作.编辑集合中的项目时不会触发.为什么.
有点长,但这是我放在一起的一个例子.
我有一个customerViewModel,它包含一个OrderViewModel集合,当编辑datagrid中的事件不会触发时.
我已经实现了以下内容,但只有在加载时才会被解雇.好像它不是同一个东西的集合......
INotifyPropertyChanged inpc = OrderViewModels;
inpc.PropertyChanged += OnItemPropertyChanged;
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?这让我很生气
楷模
public class Order
{
public int Id { get; set; }
public string Description { get; set; }
public int CustomerId{ get; set; }
}
public class Customer
{
public Customer()
{
Orders=new ObservableCollection<Order>();
}
public int Id { get; set; }
public string Name { get; set; }
public string Surname{ get; set;}
public ObservableCollection<Order> Orders{ get; set;}
}
Run Code Online (Sandbox Code Playgroud)
的ViewModels
public class CustomerViewModel : ViewModelBase
{ …Run Code Online (Sandbox Code Playgroud) 我的xaml中有几个Tiles(TileLayoutControl类)(本例中只显示了2个),其可见性绑定到布尔属性并通过BooleanToVisibilityConverter转换.
这很好用.我的问题是
我可以将可见性绑定到Command,以便我可以删除那些几个布尔属性的需要吗?
类似于将Visibility绑定到Command.CanExecute的东西
如果是,我该如何实现?任何帮助将非常感谢!谢谢.
<dxlc:Tile Command="{Binding Tile1Command}"
Visibility="{Binding Path=IsTile1Visible , Converter={StaticResource BooleanToVisibilityConverter}}"/>
<dxlc:Tile Command="{Binding Tile2Command}"
Visibility="{Binding Path=IsTile2Visible , Converter={StaticResource BooleanToVisibilityConverter}}"/>
Run Code Online (Sandbox Code Playgroud)
视图模型
private bool _isTile1Visible;
public bool IsTile1Visible
{
get { return _isTile1Visible; }
set { this.RaiseAndSetIfChanged(ref _isTile1Visible, value); }
}
public ReactiveCommand Tile1Command { get; private set; }
Tile1Command = new ReactiveCommand();
Tile1Command.Subscribe(p => PerformTile1Operation());
Run Code Online (Sandbox Code Playgroud) 我的项目是用MVVM实现的。我有一个主窗口,它由状态栏和选项卡视图组成。在选项卡视图内,有一个名为“AnnotationView”的用户控件。Annotationview 是两个较小的用户控件(称为 TimePicker)的父控件。TimePicker 由两个文本框组成,一个用于小时,一个用于分钟。我想使用此 UserControl 两次(这也是我将其设为自己的 Control 的原因,以便稍后重用它)。
TimePicker 的 XAML:
<UserControl x:Class="archidb.Views.TimePicker"
x:Name="TimePickerControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d" Height="Auto" Width="Auto"
KeyboardNavigation.TabNavigation="Local">
<Grid DataContext="{Binding ElementName=TimePickerControl}">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="5"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=HourValue}"
x:Name="tbHours"
KeyboardNavigation.TabIndex="0"/>
<TextBlock Style="{StaticResource TextBlockStyle}"
Margin="0 -3 0 5"
Text=":"
Grid.Column="1"/>
<TextBox Grid.Column="2" Style="{StaticResource TextBoxStyle}"
Text="{Binding Path=MinuteValue}"
x:Name="tbMinutes"
KeyboardNavigation.TabIndex="1"/>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
TimePicker 代码隐藏:
public partial class TimePicker : UserControl
{
public static readonly DependencyProperty HourValueProperty = DependencyProperty.Register("HourValue", typeof(string), typeof(TimePicker), new PropertyMetadata("00"));
public string HourValue …Run Code Online (Sandbox Code Playgroud) 我正在开发我的第一个UWP应用程序,我希望创建一个这样的UI
.对于每个列表项(项目),将有一组按钮.对于某些列表项(项目),某些按钮将被禁用一些.因此,我需要在这些列表项(项目)中禁用和更改此类按钮的图像.
我尝试使用像这样的列表视图来实现它.但我不知道如何根据条件启用/禁用其中一些按钮.
尝试添加DataContextChanged事件并尝试访问那里的按钮.但不知道我如何访问这些按钮.
请告诉我以下方法是否正确,或者是否有更好的方法来完成我在上图中尝试实现的目标.
<ListView x:Name="stepsListView" Margin="10,0,0,0" RequestedTheme="Dark" FontSize="24" Background="{StaticResource procedure_app_white}" Foreground="Black" BorderThickness="1.5" BorderBrush="Transparent" ItemsSource="{Binding projectList}" HorizontalAlignment="Left">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle>
<!-- Item -->
<ListView.ItemTemplate>
<DataTemplate>
<Border BorderThickness="0,0,0,1" BorderBrush="#c0c0c0">
<Grid Width="auto" HorizontalAlignment="Stretch" DataContextChanged="Grid_DataContextChanged" >
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<TextBlock VerticalAlignment="Center" FontSize="30" Grid.Row="0" Grid.ColumnSpan="7" Text="{Binding projectName}" Foreground="{StaticResource procedure_app_orange_text }" />
<Button x:Name="warningButton" Width="40" Height="40" Grid.Column="1" Grid.Row="1" Tag="{Binding projectId}" …Run Code Online (Sandbox Code Playgroud) 我的解决方案是在MVVM中实现的.视图是一个托管用户控件的窗口.我已为此userControl创建了一个依赖项属性,如下所示:
public static DependencyProperty ListProperty = DependencyProperty.Register(
"ItemsList", typeof(List<RequiredClass>), typeof(UsercontrolTest));
public List<RequiredClass> ItemsList
{
get { return (List<RequiredClass>)GetValue(ListProperty); }
set
{
SetValue(ListProperty, value);
}
}
Run Code Online (Sandbox Code Playgroud)
此属性绑定到xaml中的viewmodel属性(ListOfItems):
<Window x:Class="TestProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Test="clr-namespace:TestProject"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Test:UserControlTest Grid.Row="0" ItemsList="{Binding Path=ListOfItems}" />
<Button Grid.Row="1" Content="AddItems" Click="Button_Click" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
此外,我已将codebehind窗口的datacontext初始化为viewmodel.问题是绑定似乎永远不会发生,并且永远不会为依赖项属性调用set属性.我在这里错过了什么吗?
我的项目中有一个数据网格,在获取字符串后,其中一部分不适合,因为它们太长了.我希望我的文本框列具有固定的大小,所以我不想为文本框使用"自动"宽度属性,但我想知道:是否有某种属性可以用来显示整个字符串?例如:如果字符串是长显示它的一部分你可以适合,然后显示三个点(...)或一些像这样的符号.点击三个点后显示文本框的整个值.或者甚至在滚动一些文本框后显示整个字符串.
我的数据网格看起来像这样.

在那里你可以看到一些太长的字符串值被削减了.
这是数据网格中文本框的xaml代码.
<DataGrid Grid.Column="0" Grid.RowSpan="2" AutoGenerateColumns="False" Height="206" HorizontalAlignment="Left" Margin="12,265,0,0" Name="tabela" VerticalAlignment="Top" Width="556" SelectionChanged="tabela_SelectionChanged" ItemsSource="Binding MyObsCollection">
<DataGrid.Columns>
<DataGridTextColumn Header="Type" Width="120" Binding="{Binding Type}"/>
<DataGridTextColumn Header="MapTo" Width="120" Binding="{Binding MapTo}"/>
<DataGridTextColumn Header="Name" Width="116" Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud) 我想创建一个图像幻灯片。为此,我在每个设定的时间间隔后在图像控件中加载了新图像。但是每次我加载一个新图像时,它都没有任何动画,我需要用过渡动画或淡入淡出动画加载每个图像。如何在图像控件中更改图像时实现动画?以下是代码:
XAML:
<Grid>
<Image Source="{Binding CurrentImage}" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
XAML文件
ViewModel = new ScreenSaverViewModel();
this.DataContext = ViewModel;
Run Code Online (Sandbox Code Playgroud)
视图模型.cs
/// <summary>
/// Gets the current image to display on the attract screen. Changes to this property
/// cause the PropertyChanged event to be signaled
/// </summary>
public string CurrentImage
{
get { return this.currentImage; }
protected set
{
this.currentImage = value;
this.OnPropertyChanged("CurrentImage");
}
}
/// <summary>
/// Gets the observable collection of all images.
/// </summary>
public ObservableCollection<string> Images
{
get { …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助将viewModel绑定到我创建的两个usercontrol视图.
创建了一个应该包含这两个用户控件的预留窗口.
我得到了什么:
ReservationView(Window)类
public partial class ReservationView : Window
{
public ReservationView()
{
InitializeComponent();
//DataContext = null;
}
}
Run Code Online (Sandbox Code Playgroud)
ReservationListView(Usercontrol)类:
public partial class ReservationListView : UserControl, IViewReservationListViewModel
{
public ReservationListView(IViewReservationListViewModel viewModel)
{
InitializeComponent();
DataContext = viewModel;
}
}
Run Code Online (Sandbox Code Playgroud)
IViewReservationListViewModel只是一个空接口,它在usercontrol视图和viewModel之间建立联系.
ReservationListViewModel
public class ReservationListViewModel : INotifyPropertyChanged, IViewReservationListViewModel
{
public ReservationListViewModel()
{
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在ReservationView中的xaml中设置本地:"usercontrol"时,我收到以下错误:
The type "ReservationListView" does not include any accessible constructors.
Run Code Online (Sandbox Code Playgroud)
当我使用MVVM时,如何将这两个usercontrol链接到相应的viewModel?
好吧,我已经搜索出了Interwebs的内容,似乎无法找到这个权利.我有一个ComboBox绑定到EntityFramework实体的CollectionViewSource.显示屏是显示名/姓的模板.问题是,当选择一个项目时,组合框的显示== object.ToString()(即MyCompany.Data.Professional)而不是有用的东西.
我确定我在这里错过了一处房产.ri是UserControl,SelectedPhysician是DependencyProperty
<ComboBox Grid.Column="1" Grid.Row="4" x:Name="cmbReferringPhys"
IsEditable="{Binding IsReadOnly}"
ItemsSource="{Binding Source={StaticResource ProfessionalLookup}}"
SelectedItem="{Binding ElementName=ri, Path=SelectedPhysian, Mode=TwoWay, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"
HorizontalAlignment="Left" VerticalAlignment="Top" Height="19.277" Width="300"
IsSynchronizedWithCurrentItem="True"
SelectionChanged="ReferringPhy_SelectionChanged" TabIndex="4">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="120" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding FirstName}" Grid.Column="0" Margin="4,0" />
<TextBlock Text="{Binding LastName}" Grid.Column="1" Margin="4,0"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
Run Code Online (Sandbox Code Playgroud) wpf ×9
c# ×7
xaml ×5
mvvm ×3
data-binding ×2
animation ×1
canexecute ×1
combobox ×1
datagrid ×1
image ×1
itemscontrol ×1
listview ×1
reactiveui ×1
textbox ×1
uwp ×1
uwp-xaml ×1
visibility ×1