您需要一个 JavaFX 友好的设计模式来共享应用程序逻辑。
例如在 WPF 中它是 MVVM。有这个和绑定是。JavaFX 中有什么相似之处?是否有任何资源可以证明这一切?
PS MVVM 也发生在 JavaFX 中,不是吗?那么请分享一个使用这个模板的例子的链接!
您需要一个 JavaFX 友好的设计模式来共享应用程序逻辑。
例如在 WPF 中它是 MVVM。有这个和绑定是。JavaFX 中有什么相似之处?是否有任何资源可以证明这一切?
PS MVVM 也发生在 JavaFX 中,不是吗?那么请分享一个使用这个模板的例子的链接!
在列表的所有元素之后,有一个空白区域。ListView.Height = 610
它仍然是由于默认的事实。ListView 不会调整到其所有 Item 的高度,除非它们的组合高度大于 610。
如何解决这个问题?如何确保这个空间(额外高度)不存在?
从这里尝试了解决方案,但他们没有帮助......
PS 请不要提供为 ListView 设置固定高度的选项。这个选项对我不起作用。
更新
页面布局:
<ScrollView>
<StackLayout>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<custom:CustomFrame CornerRadius="0, 0, 0, 10" BackgroundColor="#f9f9f9" HorizontalOptions="Start">
<Label Text="{Binding CurrentTicket.Number, StringFormat='Билет {0}'}" />
</custom:CustomFrame>
<custom:CustomFrame Grid.Column="1" CornerRadius="0, 0, 10, 0" WidthRequest="60" BackgroundColor="#f9f9f9" HorizontalOptions="End">
<Label Text="{Binding TimeLeft}" HorizontalOptions="Center" />
</custom:CustomFrame>
</Grid>
<Label Text="{Binding CurrentTicket.Question}" FontSize="24" HorizontalTextAlignment="Center" TextColor="#0051DE" Margin="15, 20"/>
<ListView x:Name="List" HasUnevenRows="True" SeparatorVisibility="None" ItemsSource="{Binding CurrentTicket.Answers}" SelectedItem="{Binding SelectedAnswer}" VerticalOptions="Start">
<ListView.ItemTemplate>
<DataTemplate>
<custom:CustomViewCell SelectedItemBackgroundColor="White">
<ViewCell.View>
<custom:CustomFrame Padding="15, 10" Margin="10, 5" CornerRadius="10" BackgroundColor="#F8FBFF">
<Label Text="{Binding Value}" FontSize="17" TextColor="#464E56"/>
<custom:CustomFrame.Triggers>
<DataTrigger TargetType="custom:CustomFrame" Binding="{Binding IsSelected}" Value="True">
<Setter Property="BackgroundColor" Value="#9DF2FF"/>
</DataTrigger>
</custom:CustomFrame.Triggers>
</custom:CustomFrame>
</ViewCell.View>
</custom:CustomViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<custom:CustomFrame BackgroundColor="#f9f9f9" CornerRadius="0, 10, 0, 0">
<Label>
<Label.FormattedText>
<FormattedString>
<Span Text="{Binding TestProgress.TotalPassedTickets}" />
<Span Text="/" />
<Span Text="{Binding TestProgress.TotalTickets}" />
</FormattedString>
</Label.FormattedText>
</Label>
</custom:CustomFrame>
<Button Grid.Column="1" Text="Дальше" BackgroundColor="#FFFFFF" BorderColor="#f1f1f1" BorderWidth="1" CornerRadius="0" HorizontalOptions="End" Padding="50, 20" Command="{Binding Continue}"/>
</Grid>
</StackLayout>
</ScrollView>
我知道Page.Navigation
,但为了使用它,您需要为按钮注册事件处理程序,并且已经“转到”其中的新页面。
这是在 MVVM 的框架内完成的,还是可以将页面之间的“转换逻辑”转移到 ViewModel 中?
我使用 Process 运行文件。如果没有程序打开此文件,则应用程序崩溃。如何解决?
Process.Start(fileName);
有一个主窗口 - MainWindow。它有一个嵌套在其中的视图。嵌套在这个View中的是另一个ChildView。该应用程序是根据 MVVM 模式进行的。
它的样子:(MainWindow)
<Window.DataContext>
<vm:RootVM />
</Window.DataContext>
<ContentPresenter Content="{Binding CurrentContentVM}"/>
看法
<UserControl x:Class="SubstationDirectory.V.SubstationEditor"
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:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SubstationDirectory.V"
xmlns:cs="clr-namespace:SubstationDirectory.Converters"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" x:Name="RootElem">
<UserControl.InputBindings>
<KeyBinding Key="Enter" Command="{Binding UpdateSubstation}"/>
</UserControl.InputBindings>
<Grid>
<local:Alert Grid.Row="0" DataContext="{Binding ElementName=RootElem, Path=DataContext.UpdateAlert}" Visibility="{Binding Converter={StaticResource VisibilityFromObjectIsNull}, ConverterParameter=false}" />
</Grid>
子视图
<UserControl x:Class="SubstationDirectory.V.Alert"
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"
xmlns:local="clr-namespace:SubstationDirectory.V"
xmlns:cs="clr-namespace:SubstationDirectory.Converters"
mc:Ignorable="d"
Name="RootElem">
<UserControl.InputBindings>
<KeyBinding Key="Enter" Command="{Binding MainAction}"/>
</UserControl.InputBindings>
</UserControl>
您需要将 Enter 按钮绑定到ChildView 命令。
如您所见,我尝试使用InputBindings
. 但它没有用。在视图中也进行了绑定。但一切都在那里工作。
如何使ChildView中的键绑定起作用?
有这样一个模型:
public class School
{
public School()
{
}
[Key]
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Teacher> Teachers { get; set; }
public IEnumerable<Student> Students { get; set; }
}
有一个数据库上下文:
public class MainDbContext : DbContext
{
public MainDbContext(DbContextOptions<MainDbContext> options) : base(options)
{
Database.EnsureCreated();
}
public DbSet<School> Schools { get; set; }
}
在构建项目时,会创建一个数据库及其表。我希望在这个数据库中只看到一个表Schools
,但我看到了以下内容:
表中的列Schools
如下所示:
下面是表构造函数的样子Students
:
为什么列表School.Students
和School.Teachers
显示在单独的表格中?这可以以某种方式解决吗?
这是另一个问题。
据我了解:这一行表示该列是表中SchoolId
的链接。是这样吗?School.Id
Schools
我希望看到这样的表格Schools
:
我有一个列表,它通过绑定到它的VM
ki 属性来接收元素:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemsTemplate>
<DataTemplate>
<Button Content="Удалить" Command="{Binding ElementName=Parent, Path=DataContext.DeleteItem" CommandParameter="{Binding Id}"/>
</DataTemplate>
</ItemsControl.ItemsTemplate>
</ItemsControl>
这里有一个按钮:
<Button Content="Удалить" Command="{Binding ElementName=Parent, Path=DataContext.DeleteItem" CommandParameter="{Binding Id}"/>
为了使命令正常工作,我需要传递Item.Id
并且已经在命令代码中,我需要通过按 Id 搜索匹配来查找具有此索引的元素。不舒服。
是否有可能以某种方式将对象本身传递给命令Item
,而不是它的属性Id
?
这是我标记它的方式Expander.Header
:
<Expander.Header>
<Grid Background="LightGray">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Name}" TextWrapping="Wrap" Margin="0, 0, 20, 0" FontSize="14" VerticalAlignment="Center"/>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<Button Content="Редактировать" Padding="10, 4" FontSize="14"/>
</StackPanel>
</Grid>
</Expander.Header>
问题
为什么Grid
没有拉伸?以及如何将其拉伸到全宽Expander
?
如果用户没有点击这个按钮,数据将不会被保存。为了防止这种情况,我做了一个“提醒”,可以在网站上找到。Alert
- 大致说来。它应该给用户一个选择:要么保留数据,要么丢失数据。
我认为它的实现方式没有区别 - 所以我不会用“额外”代码乱扔问题。
问题
使这个“提醒”可见的正确方法是什么(比如Visible = Visible
- 也就是说,只是改变它的属性Visible
)?
您可以将这整个部分与数据编辑分开到一个单独的UserControl
. 在其中,定义一个在数据可能丢失时将被调用的事件。并给这个事件的处理者改变Alert.Visibile
。
我这样做:
ObservableCollection<T>
List<T>
并foreach
在每次迭代中添加到ObservableCollection
元素List
;我不认为这是“时髦”。如何让这个任务“别致”?
为这种情况编写扩展是一个不错的选择吗?
我想覆盖这个模板TextBox
:
<ControlTemplate x:Key="CustomTextBox" TargetType="TextBox">
<Border x:Name="n" CornerRadius="2" BorderThickness="1" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}">
<TextBox Text="{TemplateBinding Text}" BorderThickness="0" Padding="{TemplateBinding Padding}"/>
</Border>
</ControlTemplate>
这是我用它的:
<TextBox x:Name="TicketAmountField" Template="{StaticResource CustomTextBox}" Padding="10, 3, 10, 3" Text="{Binding TicketAmount, UpdateSourceTrigger=PropertyChanged}" FontSize="18" Foreground="#307CF6" Margin="5, 0, 0, 0" VerticalAlignment="Center" BorderBrush="#92B8F6"/>
TextBox 只能从绑定的属性中获取值,但不能调用setter。
我检查过:如果您在模板中替换<TextBox />
为<ContentControl />
,那么一切都会正常工作。但我不喜欢当字段获得焦点时没有光标。
如何使该字段正常运行(有一个光标)并且绑定在两个方向上都有效?
该应用程序是根据 MVVM 模式构建的。我有一个 CheckBox,在该状态下TextBlock的VisibilityIsChecked = true
属性应该更改,并且在该状态下它应该返回到默认状态。IsChecked = false
如何在这种模式下实现它?将事件处理程序分配给MainWindow
?
我想用 做一个列表ItemsSource
,即列表项将自动创建。问题是我想更改ListBoxItem
.
我如何告诉它使用特定模板呈现这个 auto-ListBoxItem?
我有一个应用程序“测试仪”。在任何测试中至少有 3 个部分:
为了控制第一部分输入的数据,通过单击“下一张票”按钮显示新票,还显示进度等。在列表的第 2 项和显示测试结果,您需要创建一个class TestingController
。
它包含这样的代码(我还没有写一堆必要的辅助字段,每个部分需要的属性和方法):
class TestingController
{
/// ПЕРВАЯ СЕКЦИЯ (НАСТРОЙКА И НАЧАЛО ТЕСТИРОВАНИЯ)
// Время тестирования
DateTime TestingTime { get; set; }
// Количество билетов
int TicketsAmount { get; set; }
// Этот метод будет вызываться при нажатии на кнопку "Начать тестирование"
void GetStarted()
{
//// Выводим вторую секцию
}
//////////////////////////////////////////////////////
/// ВТОРАЯ СЕКЦИЯ (БИЛЕТЫ)
// Вывод нового билета
void GetNextTicket()
{
//// код замены значений у UIElement'ов
}
// Выводим "пройдено_билетов/осталось"
void OutputTestingProgress()
{
//// код
}
// Выводим оставшееся время на прохождение теста каждую секунду с помощью класса Timer
void OutputTimeLeft()
{
//// код
}
//////////////////////////////////////////////////////
/// ТРЕТЬЯ СЕКЦИЯ (РЕЗУЛЬТАТЫ)
void GetResults()
{
// выводим третью секцию
}
}
这样做是否值得:将应用程序的 3 个部分的所有功能组合到一个 class_controller 中?或者将这个类划分为每个部分的3个相同的控制器更正确,每个控制器都将存储它们的属性和显示该部分的方法?
请帮帮我!我是创建应用程序的新手,并不真正了解如何正确构建应用程序的架构。
我不想编写糟糕的代码。
checkBox有这样的模板
<ControlTemplate x:Key="CustomCheckBox" TargetType="CheckBox">
<StackPanel Orientation="Horizontal" Margin="11, 0, 0, 0">
<Canvas VerticalAlignment="Center" Width="30" Height="19" Margin="{TemplateBinding Padding}">
<Ellipse x:Name="CheckBoxBackCircle" Width="50" Height="50" Fill="#F8F8FA" Opacity="0">
<Ellipse.RenderTransform>
<TranslateTransform X="-15" Y="-15"/>
</Ellipse.RenderTransform>
</Ellipse>
<Path x:Name="CheckBoxSquare" Data="M.5,12.5 l0,4 q0,2 2,2 l15,0 q1,0 1,-2 l0,-14 q0,-2 -2,-2 l-15,0 q-1,0 -1,2 l0,10" Stroke="#D6D9DF" StrokeThickness="1.4" StrokeDashArray="69.5" Fill="White" Stretch="Fill" Width="20" Height="20"/>
<Path x:Name="CheckBoxCheck" Data="M.5,12.5 l7,6 l11,-15" Stroke="#D6D9DF" StrokeThickness="1.4" StrokeDashArray="28" StrokeDashOffset="28" />
</Canvas>
<ContentControl VerticalAlignment="Center" Content="{TemplateBinding Content}"></ContentControl>
</StackPanel>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard TargetName="CheckBoxBackCircle" TargetProperty="Opacity">
<DoubleAnimation To="1" Duration="0:0:0:0.2" FillBehavior="HoldEnd"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
<BeginStoryboard>
<Storyboard TargetName="CheckBoxSquare" TargetProperty="Stroke.Color">
<ColorAnimation To="#6FA2F6" Duration="0:0:0:0.2" FillBehavior="HoldEnd"></ColorAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard TargetName="CheckBoxBackCircle" TargetProperty="Opacity">
<DoubleAnimation To="0" Duration="0:0:0:0.2" FillBehavior="HoldEnd"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
<BeginStoryboard>
<Storyboard TargetName="CheckBoxSquare" TargetProperty="Stroke.Color">
<ColorAnimation To="#D6D9DF" Duration="0:0:0:0.2" FillBehavior="HoldEnd"></ColorAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="Checked">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard TargetName="CheckBoxSquare" TargetProperty="StrokeDashOffset">
<DoubleAnimation To="-69.5" Duration="0:0:0:1" FillBehavior="HoldEnd"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
问题是这个触发器。
<EventTrigger RoutedEvent="Checked">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard TargetName="CheckBoxSquare" TargetProperty="StrokeDashOffset">
<DoubleAnimation To="-69.5" Duration="0:0:0:1" FillBehavior="HoldEnd"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
这是带有此模板的复选框
<CheckBox Template="{StaticResource CustomCheckBox}" FontSize="17" HorizontalAlignment="Center"></CheckBox>
错误:
如果为属性设置不同的值RoutedEvent
,例如 MouseMove,那么一切都会正常工作(但似乎这不适用于所有事件,因为Click
和Unchecked
会弹出相同的错误)。
请帮帮我!
有一个固定的班级计时器Timer
。每次调用一个方法来计算时间。并且同样的方法调用另一个方法来更新 TextBox 中时钟的值。但是这里弹出一个错误:
"System.InvalidOperationException: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."
我在 Internet 上读到这是因为在 wpf 中您无法更改某些类的值。但是找到的所有解决方案都不合适,因为我有 .NET 4。
我该怎么办?
我是软件开发的新手,因此对于我的理解来说这个愚蠢但重要的问题。
我的理论是:安装程序需要工作的所有东西(对于 C# 程序,安装所需版本的 .NET、CLR 等)。
我的理论正确吗?如果没有,请向我解释是什么使程序安装?
在哪里被认为是正确的使用数据库?在控制器中还是在单独的文件中?