问题描述
我是新手,真的不知道如何解决这类问题。我确实有一个UserControl
,上面是Ribbon
,下面是DataGrid
。单击用户后,它将以新窗口打开。实际的问题是DataGrid
在每个恒定的时间段内进行更新,例如,每隔一秒钟就会更新一次新行,因此,窗口的高度会发生变化以适应内容,并且仅在到达时才停止增长屏幕底部。
XAML文件:
<UserControl x:Class="Aean.Commissioning.Views.JournalingServiceView"
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:p="clr-namespace:Aean.Commissioning.Properties"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="600"
Background="White"
Margin="0,5" x:Name="journalingServiceView">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Ribbon x:Name="ribbonPanel" Grid.Row="0"
Focusable="false" KeyboardNavigation.TabNavigation="None"
ContextMenu="{x:Null}" ShowQuickAccessToolBarOnTop="False">
<Ribbon.ApplicationMenu>
<RibbonApplicationMenu Visibility="Collapsed"/>
</Ribbon.ApplicationMenu>
<RibbonTab x:Name="journalingServiceTab" Tag="JournalingServiceView"
ContextMenu="{x:Null}"
Header="{x:Static p:Resources.Journals}">
<RibbonGroup UIElement.Uid="DiscoveryOperations"
IsEnabled="{Binding Path=.,Converter={StaticResource ObjectToBoolConverter},FallbackValue=False,TargetNullValue=False}"
UseLayoutRounding="True"
HeaderedItemsControl.Header="Overview" ContextMenu="{x:Null}">
<RibbonGroup.GroupSizeDefinitions>
<RibbonGroupSizeDefinition>
<RibbonControlSizeDefinition ImageSize="Large" IsLabelVisible="true"/>
<RibbonControlSizeDefinition ImageSize="Large" IsLabelVisible="true"/>
</RibbonGroupSizeDefinition>
</RibbonGroup.GroupSizeDefinitions>
<RibbonButton UIElement.Uid="" Label="{x:Static p:Resources.DownloadConfig}"
Command="{Binding GetJournalsCommand}"
LargeImageSource="/assets/download.png" Style="{StaticResource AeanButtonStyle}" />
</RibbonGroup>
</RibbonTab>
</Ribbon>
<DataGrid x:Name="journalDataEntries" Grid.Row="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
UseLayoutRounding="True"
IsReadOnly="True"
ItemsSource="{Binding JournalDataEntries,Mode=Default,UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridTextColumn Header="Time" Binding="{Binding Id}" Width="Auto"/>
<DataGridTextColumn Header="Group ID" Binding="{Binding GroupId}" Width="80"/>
<DataGridTextColumn Header="Message Type ID" Binding="{Binding MessageTypeId}" Width="90"/>
<DataGridTextColumn Header="Object ID" Binding="{Binding ObjectId}" Width="80"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
我认为这是不可接受的,我试图通过将DataGrid
的高度绑定到窗口的高度(link #1和#2)来解决此问题。效果不好。我无法将尺寸设置为比例,因为它会改变Ribbon
的高度,它必须像固定的导航栏,并且不会改变其高度,因此也不是解决方案({{3 }},这些答案都无法为我解决。看到link和this的答案后,我尝试将所有信息放入StackPanel
内,但问题仍然存在。
最后一个问题是:“是否有可能创建不会在AddingNewItem Event
上调整大小并占据窗口其余部分的网格。
如果需要的话,ViewModel的源代码。
using Aean.Commissioning.Infrastructure;
using Aean.Commissioning.Views;
using Aean.Core;
using DynamicData;
using IO.Swagger.Api;
using IO.Swagger.Model;
using NLog;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;
using System.Threading.Tasks;
using System.Timers;
namespace Aean.Commissioning.ViewModels.Widgets
{
public class JournalServiceViewModel
{
[Browsable(false)]
public string Id { get; set; }
public string Timestamp { get; set; }
public int? GroupId { get; set; }
public int? MessageTypeId { get; set; }
public int? ObjectId { get; set; }
public string Val1 { get; set; }
public string Val2 { get; set; }
[Browsable(false)]
public JournalDataEntry JournalDataEntry => new JournalDataEntry(Id,Timestamp,GroupId,MessageTypeId,ObjectId,Val1,Val2);
public JournalServiceViewModel() : this(new JournalDataEntry(DefaultId,DefaultTimestamp,DefaultGroupId,DefaultMessageTypeId,DefaultObjectId,DefaultVal1,DefaultVal2))
{
}
public JournalServiceViewModel(JournalDataEntry prototype)
{
Refresh(prototype);
}
internal void Refresh(JournalDataEntry prototype)
{
Id = prototype.Id;
Timestamp = prototype.Timestamp;
GroupId = prototype.GroupId;
MessageTypeId = prototype.MessageTypeId;
ObjectId = prototype.ObjectId;
Val1 = prototype.Val1;
Val2 = prototype.Val2;
}
private static string DefaultId => "default";
private static string DefaultTimestamp => new DateTime(2001,1,DateTimeKind.Utc).ToString();
private static int? DefaultGroupId => 0;
private static int? DefaultMessageTypeId => 0;
private static int? DefaultObjectId => 0;
private static string DefaultVal1 => "default";
private static string DefaultVal2 => "default";
}
[WidgetManager(typeof(JournalingServiceView))]
[Description("Сообщения")]
[Category("Обмен данными")]
public class JournalingServiceViewModel : CustomDisplayViewModel
{
public HistoryApi API { get; private set; }
private Dictionary<string,bool> IdLookupTable { get; set; } = new Dictionary<string,bool>();
[Reactive]
public ObservableCollection<JournalDataEntry> JournalDataEntries { get; set; } = new ObservableCollection<JournalDataEntry>();
public string LastKnownId { get; set; } = null;
public JournalingServiceViewModel(INetworkCommunicationService dataService) : base(dataService)
{
GetJournalsCommand = ReactiveCommand.CreateFromTask(GetJournalDataEntries);
GetJournalsCommand.ThrownExceptions.Subscribe(exception =>
{
LocalLog(new LogEventInfo(LogLevel.Error,"",exception.ToString()));
});
}
protected override void CollectModels()
{
var connector = new ApiConnector(DataService);
API = new HistoryApi(connector);
GetJournalDataEntries();
}
public override void Refresh(object sender,ElapsedEventArgs e)
{
Update();
}
private async Task GetJournalDataEntries()
{
await Observable.Start(() =>
{
try
{
Update();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
},RxApp.MainThreadScheduler);
}
private async void Update()
{
await Observable.Start(async () =>
{
try
{
var a = await API.GetJournalAsync(LastKnownId);
a.ForEach(x => {
if (!IdLookupTable.ContainsKey(x.Id))
{
IdLookupTable.Add(x.Id,true);
JournalDataEntries.Add(x);
}
});
LastKnownId = JournalDataEntries.Last().Id;
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
},RxApp.MainThreadScheduler);
}
public ReactiveCommand<Unit,Unit> GetJournalsCommand { get; private set; }
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)