小编RB8*_*B84的帖子

在 XAML 中设计带有标签和输入的视图的最佳方法

每次有人要求我提供输入值的界面时,我发现自己创建了包含大量行和列的网格。试图寻找这个问题的答案,但发现很难

代码

 <Grid HorizontalAlignment="Left" VerticalAlignment="Top">
            <Grid.Resources>
                <Style TargetType="RowDefinition">
                    <Setter Property="Height" Value="25"/>
                </Style>
                <Style TargetType="TextBox">
                    <Setter Property="Margin" Value="2"/>
                </Style>
            </Grid.Resources>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="60"/>
                <ColumnDefinition Width="150"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Grid.Column="0">Input 1</TextBlock>
            <TextBox Grid.Row="0" Grid.Column="1"></TextBox>
            <TextBlock Grid.Row="1" Grid.Column="0">Input 2</TextBlock>
            <TextBox Grid.Row="1" Grid.Column="1"></TextBox>
        </Grid>
Run Code Online (Sandbox Code Playgroud)

结果

例子

我想到的问题是是否有任何性能考虑,或者是否有另一种方法可以消除使用行号和列号维护属性的需要。

此处讨论了创建带有标签和输入的自定义控件的选项,但这会带来更多开销。

创建布局似乎有点重复,这让我想知道是否有一个工具可以做到这一点。

问题

这是最好的方法吗?如果不是,为什么以及应该如何做?

c# wpf xaml

7
推荐指数
0
解决办法
695
查看次数

Timer对象存在于窗口对象生存期之外

我正在显示一个Forms窗口作为对话框

private void buttonOverview_Click(object sender, EventArgs e)
{
    (new OverviewBox()).ShowDialog();
    MessageBox.Show("Window Exited");
}
Run Code Online (Sandbox Code Playgroud)

OverviewBox 有一个刷新计时器,在构造函数中实例化

public OverviewBox()
{
    InitializeComponent();

    this._polltimer = new Timer { Interval = 30000, Enabled = true };
    this._polltimer.Tick += (sender, e) => { this.Poll(); };
}
Run Code Online (Sandbox Code Playgroud)

该方法Poll异步从数据库获取数据并更新视图而不冻结它.

private void Poll()
{
    Task.Run(() =>
    {
        if (!SessionContext.Connectable())
        {
            return;
        }
        try
        {
            [logics to get data]
            this.dgvChangeCoordinators.BeginInvoke(new Action(() => { SetDataGridView(this.dataGridView, "<Data Description>", listwithdata); }));
        }
        catch (Exception ex)
        {
            Logger.Log(ex.ToString());
            throw;
        } …
Run Code Online (Sandbox Code Playgroud)

c#

3
推荐指数
1
解决办法
526
查看次数

学习Div安置

对所有单独的组件进行了大量研究.但是,我不明白组件如何协同工作.几个安置问题在不同的场合困扰着我.我想了解为什么它的行为像它一样.

设计具有固定标题的网站,其中包含一些按钮.我希望按钮放在彩色行(NAV)上.这就是为什么我做了NAV的孩子.但是我似乎无法将按钮放在栏上.

HTML

<body>
<nav class="row">
    <ul class="menu">
        <li id="link1"><a href="#link1">Link 1</a></li>
        <li id="link2"><a href="#link2">Link 2</a></li>
        <li id="link3"><a href="#link3">Link 3</a></li>
        <li id="link4"><a href="#link4">Link 4</a></li>
        <li id="link5"><a href="#link5">Link 5</a></li>
    </ul>
</nav>
<div class="row main">
    @RenderBody()
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

nav, div, li {
        -moz-box-sizing: content-box;
        -webkit-box-sizing: content-box;
        box-sizing: content-box;
        border: 1px dashed black;
    }

    .row {
        width: 100%;
        padding-left: 20px;
        padding-right: 20px;
    }

    nav {
        position: fixed;
        top: 80px;
        height: 40px;
        z-index: 100;
        background-color: Green;
        border-bottom: solid greenyellow 2px;
    }

    .menu li { …
Run Code Online (Sandbox Code Playgroud)

css html5

3
推荐指数
1
解决办法
80
查看次数

使用View中的确认逻辑命令绑定到ViewModel

寻找将按钮命令绑定到ViewModel ICommand属性的最优雅解决方案,同时允许在View中进行确认.

我想做什么:

  1. 只允许用户在他/她应该时单击按钮
  2. 单击该按钮时,请确认
  3. 如果确认,请在ViewModel中工作,否则取消
  4. 不要打破MVVM架构

可以通过显示ViewModel中的消息框来满足确认要求.但是,我不认为这是要走的路.它不打破MVVM吗?如果CanExecute取决于UI(代码隐藏)和ViewModel的状态怎么办?此外,从ViewModel弹出消息框时的可测试性如何?

我尝试的另一件事是绑定OnClick(到View)和C​​ommand(到ViewModel).虽然事件始终在Command之前执行,但似乎无法取消执行该命令.此外,执行顺序似乎是一个未记录的功能,所以你不应该依赖它.除此之外,它仍然不允许CanExecute考虑View逻辑.

接下来我想出了以下解决方案:

查看(XAML)

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <Button Content="Do Work" Command="{Binding Path=ViewModel.SaveCommand}"/>
    </Grid>
    <SelectTemplateUserControl Visibility="Collapsed" OnTemplateSelected="SelectTemplate_OnTemplateSelected"/>
</Window>
Run Code Online (Sandbox Code Playgroud)

查看(代码背后)

public partial class MainWindow : Window
{
    private readonly MainViewModel _viewModel = new MainViewModel();

    public MainWindow()
    {
        InitializeComponent();
    }

    public MainViewModel ViewModel { get { return this._viewModel; } }    

    public ICommand SaveCommand { get { return new RelayCommand<int>(this.Save,                                 this.CanSave);} }

    private bool CanSave(int templateId)
    {
        return this._viewModel.SaveCommand.CanExecute(null);
    }

    private void …
Run Code Online (Sandbox Code Playgroud)

c# wpf mvvm icommand mvvm-light

3
推荐指数
1
解决办法
2018
查看次数

标签 统计

c# ×3

wpf ×2

css ×1

html5 ×1

icommand ×1

mvvm ×1

mvvm-light ×1

xaml ×1