Quantcast
Channel: Windows Presentation Foundation ( WPF ) フォーラム
Viewing all 711 articles
Browse latest View live

WPF LabelのContentStringFormatの{}の意味について

$
0
0

タイトルの内容について質問です。
ラベルの文章を下記の例のように、前後に固定の文字列で装飾したくて色々調べていました。

<Label  Content="{Binding SampleData}" ContentStringFormat="{}サンプルは{0}です"  />

結果的には、この書き方でうまく動いています。
ただ、ContentStringFormatにある最初の{}の意味がよくわかりません。{}の前に文字列を入れるとContentStringFormatが機能してくれなくなったりするのでとても不思議です。どういう物であったり、仕組みになっているのか教えてください。

string.format("aaaa{0}bbbb", data);

{0}も上の例のようなものだとあいまいに理解していますが、この考え方でよいでしょうか?

以上です。よろしくお願いします。


XAMLデザイナ上での「"TYPE"のインスタンスを作成できません。」エラーに関して

$
0
0

ユーザーコントロールを貼り付けているデザイナで、XAMLのソースを編集したのちにデバッグの開始を実行するとタイトルのようなエラーが発生してしまいます。このエラーを発生させないようにするにはどうしたらよいでしょうか?過去にも類似した質問があり、プロパティの登録時に間違った方で初期化を行っていないかを確認しましたが、そこは正しいようです。

以下のようなプログラムです。

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525"><Grid><local:UserControl1 MyProperty="1"></local:UserControl1></Grid></Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

UserControl1.xaml

<UserControl x:Class="WpfApplication1.UserControl1"
             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"
             d:DesignHeight="300" d:DesignWidth="300"><Grid></Grid></UserControl>

UserControl1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        public static int GetMyProperty(DependencyObject obj)
        {
            return (int)obj.GetValue(MyPropertyProperty);
        }

        public static void SetMyProperty(DependencyObject obj, int value)
        {
            obj.SetValue(MyPropertyProperty, value);
        }

        public int MyProperty
        {
            get { return GetMyProperty(this); }
            set { SetMyProperty(this, value); }
        }

        public static readonly DependencyProperty MyPropertyProperty =
            DependencyProperty.RegisterAttached("MyProperty", typeof(int), typeof(UserControl1), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(OnMyPropertyChanged)));

        private static void OnMyPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
        }
    }
}

MainWindow.xamlをデザイナで開いた直後は問題なく表示されています。

作成された実行モジュールでの実行時には発生していません。

申し訳ありません、環境を追記いたします

OS
Windows 8.1
Microsoft Windows [Version 6.3.9600]

開発環境
Microsoft Visual Studio Premium 2012
Version 11.0.61030.00 Update 4
Microsoft .NET Framework
Version 4.5.51641

プロジェクトの対象フレームワーク
.NET Framework 4.5

WPF Charting Toolkitでグラフの折れ線が更新されません

$
0
0

[質問]
WPF Charting Toolkitでグラフの折れ線が更新されません。

WPF Charting Toolkitで、測定値を取得しながらリアルタイムにグラフを更新(=再描画)したいのですが、折れ線が更新されません。具体的には読込まれた新しい測定データが反映されないため、時間の経過とともに右側が欠損したままとなってしまいます。
本来は右側に新しいデータに対応した折れ線が伸びるはずです。
目立ったメモリリークは発生していないように見えます。
原因の究明と対策をアドバイス願います。

[ロジックの概要]
・MyDataのプロパティをバインドして折れ線グラフを描画している。
・INotifyPropertyChangedで変更通知している。
・SamplingクラスのDispatcherTimerで新しいデータ取得している。

かなり長いですが、以下にソースコードを掲載します。

[1/3 MainWindow.xaml]

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TEST123"
        xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="TEST123.MainWindow"
        Title="MainWindow" Height="750" Width="1000"><Window.Resources><chartingToolkit:LinearAxis Orientation="Y" Minimum="0" Maximum="100" Interval="10" x:Key="Axis1" /><chartingToolkit:LinearAxis Orientation="Y" Minimum="0" Maximum="500" Interval="100" x:Key="Axis2"/><chartingToolkit:DateTimeAxis Orientation="X" Minimum="{Binding ChartFirstTime,Mode=OneWay}" Maximum="{Binding ChartLastTime,Mode=OneWay}" x:Key="AxisX"/><Style TargetType="Polyline" x:Key="Polyline1"><Setter Property="StrokeThickness" Value="1"/></Style></Window.Resources><StackPanel Orientation="Vertical"><chartingToolkit:Chart x:Name="Chart1" Title="48時間の変動" Height="500"><!-- 水分(最大) --><chartingToolkit:LineSeries  DependentValuePath="Water.Max" IndependentValuePath="Time" ItemsSource="{Binding ChartItems}" DependentRangeAxis="{StaticResource ResourceKey=Axis1}"  IndependentAxis="{DynamicResource ResourceKey=AxisX}" PolylineStyle="{StaticResource ResourceKey=Polyline1}" Title="水分(最大)"><chartingToolkit:LineSeries.DataPointStyle><Style TargetType="Control"><Setter Property="Background" Value="DarkRed"/><Setter Property="Template" Value="{x:Null}"/></Style></chartingToolkit:LineSeries.DataPointStyle></chartingToolkit:LineSeries><!-- 水分(平均) --><chartingToolkit:LineSeries DependentValuePath="Water.Average" IndependentValuePath="Time" ItemsSource="{Binding ChartItems,Mode=OneWay}"  DependentRangeAxis="{StaticResource ResourceKey=Axis1}" IndependentAxis="{DynamicResource ResourceKey=AxisX}"  PolylineStyle="{StaticResource ResourceKey=Polyline1}"  Title="水分(平均)"><chartingToolkit:LineSeries.DataPointStyle><Style TargetType="Control"><Setter Property="Background" Value="Red"/><Setter Property="Template" Value="{x:Null}"/></Style></chartingToolkit:LineSeries.DataPointStyle></chartingToolkit:LineSeries><!-- 水分(最小) --><chartingToolkit:LineSeries DependentValuePath="Water.Min" IndependentValuePath="Time" ItemsSource="{Binding ChartItems,Mode=OneWay}" DependentRangeAxis="{StaticResource ResourceKey=Axis1}" IndependentAxis="{DynamicResource ResourceKey=AxisX}"  PolylineStyle="{StaticResource ResourceKey=Polyline1}"  Title="水分(最小)"><chartingToolkit:LineSeries.DataPointStyle><Style TargetType="Control"><Setter Property="Background" Value="Pink"/><Setter Property="Template" Value="{x:Null}"/></Style></chartingToolkit:LineSeries.DataPointStyle></chartingToolkit:LineSeries><!-- 温度(最大) --><chartingToolkit:LineSeries DependentValuePath="Cnum.Max" IndependentValuePath="Time" ItemsSource="{Binding ChartItems,Mode=OneWay}" DependentRangeAxis="{StaticResource ResourceKey=Axis2}" IndependentAxis="{DynamicResource ResourceKey=AxisX}"  PolylineStyle="{StaticResource ResourceKey=Polyline1}"  Title="温度(最大)"><chartingToolkit:LineSeries.DataPointStyle><Style TargetType="Control"><Setter Property="Background" Value="DarkBlue"/><Setter Property="Template" Value="{x:Null}"/></Style></chartingToolkit:LineSeries.DataPointStyle></chartingToolkit:LineSeries><!-- 温度(平均) --><chartingToolkit:LineSeries DependentValuePath="Cnum.Average" IndependentValuePath="Time" ItemsSource="{Binding ChartItems,Mode=OneWay}" DependentRangeAxis="{StaticResource ResourceKey=Axis2}" IndependentAxis="{DynamicResource ResourceKey=AxisX}"  PolylineStyle="{StaticResource ResourceKey=Polyline1}"  Title="温度(平均)"><chartingToolkit:LineSeries.DataPointStyle><Style TargetType="Control"><Setter Property="Background" Value="Blue"/><Setter Property="Template" Value="{x:Null}"/></Style></chartingToolkit:LineSeries.DataPointStyle></chartingToolkit:LineSeries><!-- 温度(最小) --><chartingToolkit:LineSeries DependentValuePath="Cnum.Min" IndependentValuePath="Time" ItemsSource="{Binding ChartItems,Mode=OneWay}" DependentRangeAxis="{StaticResource ResourceKey=Axis2}" IndependentAxis="{DynamicResource ResourceKey=AxisX}"  PolylineStyle="{StaticResource ResourceKey=Polyline1}"  Title="温度(最小)"><chartingToolkit:LineSeries.DataPointStyle><Style TargetType="Control"><Setter Property="Background" Value="LightBlue"/><Setter Property="Template" Value="{x:Null}"/></Style></chartingToolkit:LineSeries.DataPointStyle></chartingToolkit:LineSeries></chartingToolkit:Chart></StackPanel></Window>

[2/3 MainWindow.xaml.cs]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TEST123
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();


            DateTime firstDate = new DateTime(2014, 4, 1, 0, 0, 0);


            // TimeSpan totalSpan = new TimeSpan(2, 0, 0, 0);
            TimeSpan totalSpan = new TimeSpan(0, 5, 0);

            // TimeSpan updateSpan = new TimeSpan(0, 0, 3);
            TimeSpan updateSpan = new TimeSpan(0, 0, 1);

            // TimeSpan chartSpan = new TimeSpan(0, 5, 0);
            TimeSpan chartSpan = new TimeSpan(0, 0, 5);


            Random rnd = new Random();
            List<SamplingItem> list = new List<SamplingItem>();
            for (int index = 0; index < totalSpan.TotalMilliseconds / updateSpan.TotalMilliseconds; index++)
            {
                DateTime time = firstDate.AddMilliseconds(updateSpan.TotalMilliseconds * index);
                double water = 10 + rnd.NextDouble() * 3;
                double cnum = 345 + rnd.NextDouble() * 30;
                list.Add(new SamplingItem(time, water, cnum));
            }

            _myData = new MyData(totalSpan, chartSpan);

            _myData.Add(list);
            _dummy = new DummySample(list.Last().Time + updateSpan, updateSpan);

            Sampling sample = new Sampling(_myData, _dummy,this.Dispatcher);

            sample.Start();

            this.DataContext = _myData;
        }


        #region フィールド
        private MyData _myData;
        private DummySample _dummy;
        #endregion
    }
}

[3/3 上記以外のC#]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Windows.Threading;

namespace TEST123
{

    /// <summary>
    /// ダミー測定値
    /// </summary>
    public class DummySample : IMyitemGettable
    {

        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="first">開始時刻</param>
        /// <param name="span">サンプリング周期</param>
        public DummySample(DateTime first,TimeSpan span)
        {
            _first = first;
            _span = span;
        }

        /// <summary>
        /// 回線を開く
        /// </summary>
        public void Open()
        {
            _rnd = new Random();
            _count = 0;

        }

        /// <summary>
        /// 測定値を取得する
        /// </summary>
        /// <returns></returns>
        public SamplingItem GetValue()
        {
            DateTime time = _first.AddMilliseconds(_count * _span.TotalMilliseconds);
            double water = 15 + _rnd.NextDouble() * 3;
            double cn = 340 + _rnd.NextDouble() * 10;
            _count++;
            return new SamplingItem(time, water, cn);
        }
        /// <summary>
        /// 回線を閉じる
        /// </summary>
        public void Close()
        {

        }

        /// <summary>
        /// サンプリング周期
        /// </summary>
        public TimeSpan SamplingSpan { get { return _span; } }

        private Random _rnd;
        private readonly DateTime _first;
        private readonly TimeSpan _span;
        private long _count;
    }

    /// <summary>
    /// 測定値の取得方法
    /// </summary>
    public interface IMyitemGettable
    {
        /// <summary>
        /// 回線を開く
        /// </summary>
        void Open();

        /// <summary>
        /// 測定値を取得する
        /// </summary>
        /// <returns></returns>
        SamplingItem GetValue();

        /// <summary>
        /// 回線を閉じる
        /// </summary>
        void Close();

        /// <summary>
        /// サンプリング周期
        /// </summary>
        TimeSpan SamplingSpan { get; }
    }

    /// <summary>
    /// 測定データ
    /// </summary>
    internal class MyData : INotifyPropertyChanged
    {
        #region コンストラクタ

        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="saveSpan">保管期間</param>
        /// <param name="chartSpan">チャート表示間隔</param>
        public MyData(TimeSpan saveSpan, TimeSpan chartSpan)
        {
            _samplingItems = new List<SamplingItem>();
            _saveSpan = saveSpan;
            _chartSpan = chartSpan;
            UpdateChartItems();

            OnPropertyChanged("SamplingItems");
            OnPropertyChanged("SaveSpan");
            OnPropertyChanged("ChartSpan");
        }

        #endregion

        #region メソッド

        /// <summary>
        /// 測定値の追加
        /// </summary>
        /// <param name="items">測定値</param>
        public void Add(List<SamplingItem> items)
        {
            lock (_lock)
            {
                AddSamplingItem(items);
            }
        }

        /// <summary>
        /// 測定値の追加
        /// </summary>
        /// <param name="item">測定値</param>
        public void Add(SamplingItem item)
        {
            lock (_lock)
            {
                List<SamplingItem> items = new List<SamplingItem>();
                items.Add(item);
                AddSamplingItem(items);
            }
        }

        private void AddSamplingItem(List<SamplingItem> items)
        {

            if (items != null)
            {
                if (items.Count > 0)
                {
                    // 測定データの追加
                    _samplingItems.AddRange(items);
                    _samplingItems.Sort();
                    DateTime lastTime = items.Last().Time;

                    // 保存期間を超過した測定データの削除、間隔が0の場合は無効とする
                    if (_saveSpan != TimeSpan.Zero)
                    {
                        DateTime oldTime = lastTime.Subtract(_saveSpan);
                        int deletenum = _samplingItems.FindIndex(p => p.Time >= oldTime);
                        if (deletenum == -1) deletenum = items.Count;
                        _samplingItems.RemoveRange(0, deletenum);

                    }
                    OnPropertyChanged("SamplingItems");

                    // チャート表示用データの更新
                    UpdateChartItems();

                }
            }
        }



        private void UpdateChartItems()
        {
            // 開始時刻の初期化
            {
                _chartFirstTime = new DateTime(2000, 1, 1);
                if (_samplingItems != null)
                {
                    if (_samplingItems.Count > 0)
                    {
                        DateTime t1 = _samplingItems.First().Time.Date;
                        DateTime t2 = _samplingItems.Last().Time - _saveSpan;

                        _chartFirstTime = _saveSpan >= new TimeSpan(1, 0, 0) ? t1 : t2;
                    }
                }

            }

            // 終了時刻の初期化
            {
                _chartLastTime = _chartFirstTime + _saveSpan;
            }

            Func<TimeSpan, TimeSpan, int> SpanCount = (span1, span2) => (int)((long)span1.TotalMilliseconds / (long)span2.TotalMilliseconds);
            Func<DateTime, int> GetChartIndex = p => SpanCount(p - _chartFirstTime, _chartSpan);
            Func<int, DateTime> GetChartTime = p => _chartFirstTime.AddMilliseconds(_chartSpan.TotalMilliseconds * p);

            // データの初期化
            if (_chartItems == null)
            {
                _chartItems = new ChartItem[SpanCount(_saveSpan, _chartSpan) + 1];
                for (int index = 0; index < _chartItems.Length; index++)
                {
                    _chartItems[index] = new ChartItem(GetChartTime(index));
                }
            }
            else
            {
                for (int index = 0; index < _chartItems.Length; index++)
                {
                    _chartItems[index].Clear(GetChartTime(index));
                }
            }

            // データの挿入
            if (_samplingItems != null)
            {
                if (_samplingItems.Count > 0)
                {
                    foreach (var item in _samplingItems)
                    {
                        int index = GetChartIndex(item.Time);
                        if (index >= 0 && index < _chartItems.Length)
                        {
                            _chartItems[index].Add(item.Water, item.Cnum);
                        }
                    }
                }

            }


            OnPropertyChanged("ChartFirstTime");
            OnPropertyChanged("ChartLastTime");
            OnPropertyChanged("ChartItems");
        }

        #region 変更通知の実装
        private void OnPropertyChanged(string propertyName)
        {

            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }

        }
        #endregion

        #endregion

        #region プロパティ

        /// <summary>
        /// 測定データ
        /// </summary>
        public List<SamplingItem> SamplingItems { get { lock (_lock) { return _samplingItems; } } }

        /// <summary>
        /// 測定データの保存期間
        /// </summary>
        public TimeSpan SaveSpan { get { lock (_lock) { return _saveSpan; } } }

        /// <summary>
        /// チャート表示データ
        /// </summary>
        public ChartItem[] ChartItems { get { lock (_lock) { return _chartItems; } } }



        /// <summary>
        /// チャート表示間隔
        /// </summary>
        public TimeSpan ChartSpan { get { lock (_lock) { return _chartSpan; } } }


        /// <summary>
        /// チャート開始時刻
        /// </summary>
        public DateTime ChartFirstTime { get { lock (_lock) { return _chartFirstTime; } } }

        /// <summary>
        /// チャート終了時刻
        /// </summary>
        public DateTime ChartLastTime { get { lock (_lock) { return _chartLastTime; } } }


        #endregion

        #region フィールド

        private List<SamplingItem> _samplingItems;
        private readonly TimeSpan _saveSpan;

        private ChartItem[] _chartItems;
        private DateTime _chartFirstTime;
        private DateTime _chartLastTime;

        private readonly TimeSpan _chartSpan;
        private readonly object _lock = 0;
        #endregion

        #region イベント
        /// <summary>
        /// 変更通知用イベント
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion
    }

    /// <summary>
    /// 測定値のサンプリング
    /// </summary>
    public class Sampling : IDisposable
    {
        #region コンストラクタ

        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="myData">格納先</param>
        /// <param name="getter">サンプリング方法</param>
        /// <param name="dispatcher">ディスパッチャー</param>
        internal Sampling(MyData myData, IMyitemGettable getter, Dispatcher dispatcher)
        {
            _myData = myData;
            _getter = getter;
            _getter.Open();
            _timer = new DispatcherTimer(DispatcherPriority.Normal, dispatcher);
            _timer.Tick += timer_Tick;


        }

        void timer_Tick(object sender, EventArgs e)
        {
            SamplingItem item = _getter.GetValue();
            _myData.Add(item);
            Console.WriteLine("{0:yyyy/MM/dd HH:mm:ss},water={1},cnum={2}", item.Time, item.Water, item.Cnum);
        }
        #endregion

        #region デストラクタ
        /// <summary>
        /// リソースの解放
        /// </summary>
        ~Sampling()
        {
            lock (_lock)
            {
                Dispose(false);
            }
        }
        #endregion


        #region メソッド

        /// <summary>
        /// サンプリング開始
        /// </summary>
        public void Start()
        {
            lock (_lock)
            {
                _timer.Interval = _getter.SamplingSpan;
                _timer.Start();
            }
        }

        /// <summary>
        /// サンプリング停止
        /// </summary>
        public void Stop()
        {
            lock (_lock)
            {
                _timer.Stop();
            }
        }


        #region IDisposable実装
        /// <summary>
        /// リソース解放
        /// </summary>
        public void Dispose()
        {
            lock (_lock)
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }

        }

        private void Dispose(bool disposing)
        {
            if (disposing) { }

            if (_getter != null)
            {
                _getter.Close();
                _getter = null;
            }

        }
        #endregion

        #endregion

        #region フィールド

        private MyData _myData;
        private IMyitemGettable _getter;
        private DispatcherTimer _timer;
        private readonly object _lock = 0;
        #endregion
    }

    /// <summary>
    /// 測定値
    /// </summary>
    public sealed class SamplingItem : IComparable
    {
        #region コンストラクタ
        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="time">測定時刻</param>
        /// <param name="water">水分</param>
        /// <param name="cn">温度</param>
        public SamplingItem(DateTime time, double water, double cn)
        {
            _time = time;
            _water = water;
            _cnum = cn;
            _lock = 0;
        }
        #endregion

        #region プロパティ

        /// <summary>
        /// 測定時刻
        /// </summary>
        public DateTime Time { get { lock (_lock) { return _time; } } }

        /// <summary>
        /// 水分
        /// </summary>
        public double Water { get { lock (_lock) { return _water; } } }

        /// <summary>
        /// 温度
        /// </summary>
        public double Cnum { get { lock (_lock) { return _cnum; } } }
        #endregion

        #region フィールド
        private DateTime _time;
        private double _water;
        private double _cnum;
        private readonly object _lock;
        #endregion


        public int CompareTo(object obj)
        {
            return (int)(_time-((SamplingItem)obj).Time).TotalMilliseconds;
        }
    }

    /// <summary>
    /// 集計(個数、最大、平均、最小)
    /// </summary>
    public sealed class Sigma
    {
        #region コンストラクタ
        /// <summary>
        /// 初期化
        /// </summary>
        public Sigma()
        {
            ClearValue();
        }
        #endregion

        #region メソッド
        /// <summary>
        /// 値の追加
        /// </summary>
        /// <param name="value">値</param>
        public void Add(double value)
        {
            lock (_lock)
            {
                if (GetEnabled())
                {
                    _min = Math.Min(_min, value);
                    _max = Math.Max(_max, value);
                }
                else
                {
                    _min = value;
                    _max = value;
                }
                _sum += value;
                _count++;
            }
        }

        /// <summary>
        /// 値の再初期化
        /// </summary>
        public void Clear()
        {
            lock (_lock)
            {
                ClearValue();
            }
        }

        private void ClearValue()
        {
            _count = 0;
            _sum = 0;
            _min = 0;
            _max = 0;
        }

        private double? GetValue(double value)
        {
            if(GetEnabled()) return value; else return null;
        }

        private bool GetEnabled()
        {
            return _count > 0;
        }

        #endregion プロパティ

        #region プロパティ
        /// <summary>
        /// 有効か
        /// </summary>
        public bool Enabled { get { lock (_lock) { return GetEnabled(); } } }


        /// <summary>
        /// 個数
        /// </summary>
        public int Count { get { lock (_lock) { return _count; } } }
        /// <summary>
        /// 最小
        /// </summary>
        public double? Min { get { lock (_lock) { return GetValue(_min); } } }

        /// <summary>
        /// 平均
        /// </summary>
        public double? Average { get { lock (_lock) { return GetValue(_sum / _count); } } }

        /// <summary>
        /// 最大
        /// </summary>
        public double? Max { get { lock (_lock) { return GetValue(_max); } } }

        #endregion

        #region フィールド
        private int _count;
        private double _sum;
        private double _min;
        private double _max;
        private readonly object _lock = 0;
        #endregion
    }
}


C#開発者


DataGridの左上のセルのスタイル

$
0
0

お世話になっております。

.NetFramework4.5 の環境で開発をしているのですが、DataGridのスタイルで問題を抱えております。

DataGridのHeadersVisibilityプロパティをAllにすると左上に、Item全選択/全解除の機能をデフォルトで持ったセルが出てくるのですが、ColumnHeaderStyleもRowHeaderStyleも反映されず、そのセルのみが色さえもつかない状態となっています。

このセルにスタイルを適用する方法をご存じありませんでしょうか。

基本的な事かもしれず申し訳ありませんがご教示頂ければ幸いです。
宜しくお願い致します。


折れ線グラフの見栄えを改善したい

$
0
0

WPF Toolkit Chartの折れ線グラフの見栄えを改善したい。
質問1~4の方法について教えてください。

[質問1]
横軸の軸ラベル(時刻の文字列)を時計回りに90度回転して、横幅の不足による見栄えの悪化を解消したい。10分刻みで表示させると、上下二段に表示されてしまい見栄えが悪化する。

[質問2]
横軸の軸ラベル(時刻の文字列)の書式を(a)から(b)に変更したい。

(a) "0:00","0:10","0:20", ... "0:50","1:00"      (現行はHourの桁数が変化)
(b) "00:00","00:10","00:20", ... "00:50","01:00" (希望はHourが常時2桁)

[質問3]
垂直方向の目盛線(線色=灰色、太さ=1)を2014年4月1日午前0時0分を起点として30分刻みで表示したい。

[質問4]
水平方向の目盛線(線色=灰色、太さ=1)を0を起点として50刻みで表示したい。

以下、サンプルコード

[XAML]

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="WpfApplication1.MainWindow" Title="MainWindow" Width="500" Height="600"><Window.Resources><chartingToolkit:LinearAxis  x:Key="AxisY" Orientation="Y" Minimum="-20" Maximum="200" Interval="20"/><chartingToolkit:DateTimeAxis x:Key="AxisX" Orientation="X" Minimum="{Binding StartTime,Mode=OneWay}" Maximum="{Binding EndTime,Mode=OneWay}" IntervalType="Minutes" Interval="10"/><Style TargetType="Polyline" x:Key="Polyline1"><Setter Property="StrokeThickness" Value="1"/></Style></Window.Resources><Grid><chartingToolkit:Chart Title="測定値の変動" HorizontalAlignment="Left" VerticalAlignment="Top" Width="400" Height="400"><chartingToolkit:LineSeries  DependentValuePath="Y" IndependentValuePath="X" ItemsSource="{Binding Items,Mode=OneWay}" DependentRangeAxis="{StaticResource ResourceKey=AxisY}"  IndependentAxis="{DynamicResource ResourceKey=AxisX}" PolylineStyle="{StaticResource ResourceKey=Polyline1}" Title="測定値"><chartingToolkit:LineSeries.DataPointStyle><Style TargetType="Control"><Setter Property="Background" Value="Blue"/><Setter Property="Template" Value="{x:Null}"/></Style></chartingToolkit:LineSeries.DataPointStyle></chartingToolkit:LineSeries></chartingToolkit:Chart></Grid></Window>

[C#]

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<PointXy> list = new List<PointXy>();
            list.Add(new PointXy(new DateTime(2014, 3, 31, 23, 50, 0), 110));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 0, 0, 0), 100));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 0, 10, 0), 110));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 0, 20, 0), 120));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 0, 30, 0), 130));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 0, 40, 0), 140));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 0, 50, 0), 150));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 1, 0, 0), 140));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 1, 10, 0), 130));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 1, 20, 0), 120));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 1, 30, 0), 110));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 1, 40, 0), 100));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 1, 50, 0), 90));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 2, 0, 0), 80));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 2, 10, 0), 70));
            list.Add(new PointXy(new DateTime(2014, 4, 1, 2, 10, 0), 60));

            _myData = new MyData();
            _myData.Update(list);
            this.DataContext = _myData;
        }

        private MyData _myData;
    }

    public class PointXy : INotifyPropertyChanged
    {
        public PointXy(DateTime x, double y) { _x = x; _y = y; }

        public DateTime X
        {
            get { return _x; }
            set
            {
                _x = value;
                OnPropertyChanged("X");
            }
        }
        public double Y
        {
            get { return _y; }
            set
            {
                _y = value;
                OnPropertyChanged("Y");
            }
        }
        private DateTime _x;
        private double _y;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

    public class MyData : INotifyPropertyChanged
    {
        public MyData()
        {
            _items = new ObservableCollection<PointXy>();
        }

        public void Update(List<PointXy> items)
        {
            _items.Clear();
            foreach (PointXy item in items)
            {
                _items.Add(item);
            }
            OnPropertyChanged("Items");
            OnPropertyChanged("StartTime");
            OnPropertyChanged("EndTime");
        }

        private ObservableCollection<PointXy> _items;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<PointXy> Items { get { return _items; } }

        public DateTime StartTime { get { return _items.First().X; } }

        public DateTime EndTime { get { return _items.Last().X; } }
    }
}

[描画結果]


C#開発者

ListView の View を GridView にしたときの、選択時やマウス オーバー時の表示を変更したい

$
0
0

ListView の View として GridView を指定すると、View を指定しなかった時と比べ、選択時やマウス オーバー時の表示が変化します。(角が丸くなり、ハイライトが入る)

GridView を指定した時の表示を、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"
        xmlns:my="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525"><Grid><Grid.DataContext><my:DataContextClass/></Grid.DataContext><Grid.RowDefinitions><RowDefinition/><RowDefinition Height="Auto"/><RowDefinition/></Grid.RowDefinitions><ListView Grid.Row="0" ItemsSource="{Binding ListViewItemsSource, Mode=OneWay}"><ListView.View><GridView><GridViewColumn DisplayMemberBinding="{Binding Column1}" Header="A"/><GridViewColumn DisplayMemberBinding="{Binding Column2}" Header="B"/></GridView></ListView.View></ListView><TextBlock Grid.Row="1">↑の選択時やマウス オーバー時の表示を、<LineBreak/>↓の表示と同じにしたい。</TextBlock><ListView Grid.Row="2" ItemsSource="{Binding ListViewItemsSource, Mode=OneWay}" DisplayMemberPath="Column1"/></Grid></Window>

テスト用のクラス。

using System;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
    public class DataContextClass
    {
        public ObservableCollection<ListViewItemData> ListViewItemsSource { get; private set; }

        public DataContextClass()
        {
            this.ListViewItemsSource = new ObservableCollection<ListViewItemData>();
            this.ListViewItemsSource.Add(new ListViewItemData { Column1 = "A1", Column2 = "B1" });
            this.ListViewItemsSource.Add(new ListViewItemData { Column1 = "A2", Column2 = "B2" });
            this.ListViewItemsSource.Add(new ListViewItemData { Column1 = "A3", Column2 = "B3" });
        }
    }

    public struct ListViewItemData
    {
        public string Column1 { get; set; }
        public string Column2 { get; set; }
    }
}


折れ線グラフの更新処理

$
0
0

[質問]
WPF ToolkitのChartにおいて、リアルタイムに折れ線グラフを更新したい。
その際、メモリリークが発生せず、効率的な描画方法を検討したい。
そのために必要であれば、ObservableCollectionの実装方法を見直す。
また、INotifyCollectionChangedを検討する。


[サンプルコードの前提条件]
・時系列の測定データの変動を折れ線グラフでリアルタイムで描画する。
・逐次新しいデータが追加されて、保管期限が過ぎた古いデータは廃棄される。
・保管されるデータの総数は多いが、更新されるのはその一部のみである。

[現在の実装]
・ObservableCollectionにデータを保管し、INotifyPropertyChangedで変更通知する。

[実装の問題点]
(a) 深刻なメモリーリークが発生しているようである(デバッグコンソール出力参照)。
また、動作が不安定で、MainWindowが全面黒色になったり、マウスを受付けないことがある。
(b) 描画の負荷が非常に重い。
グラフはUpdate()メソッドが1回実行される毎に1回だけ一括更新すれば十分であるが、
追加データの件数回だけ無駄に更新されているのではないか?

[例題]

ボタンをクリックすると新しいデータが4時間分追加される。

24時間分のデータが蓄積されると古いデータの廃棄が始まり、データ総数が一定となる。

以下サンプルコード

[XAML MainWindow.xaml]

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="WpfApplication1.MainWindow" Title="MainWindow" Width="600"><Window.Resources><chartingToolkit:LinearAxis  x:Key="AxisY" Orientation="Y" Minimum="-10" Maximum="30" Interval="10"/><chartingToolkit:DateTimeAxis x:Key="AxisX" Orientation="X" Minimum="{Binding StartTime,Mode=OneWay}" Maximum="{Binding EndTime,Mode=OneWay}" IntervalType="Hours" Interval="4"/><Style TargetType="Polyline" x:Key="Polyline1"><Setter Property="StrokeThickness" Value="1"/></Style></Window.Resources><StackPanel><chartingToolkit:Chart Title="測定値の変動" Height="400"><chartingToolkit:LineSeries  DependentValuePath="Y" IndependentValuePath="X" ItemsSource="{Binding Items, Mode=OneWay}" DependentRangeAxis="{StaticResource ResourceKey=AxisY}"  IndependentAxis="{DynamicResource ResourceKey=AxisX}" PolylineStyle="{StaticResource ResourceKey=Polyline1}" Title="測定値"><chartingToolkit:LineSeries.DataPointStyle><Style TargetType="{x:Type Control}"><Setter Property="Background" Value="Blue"/><Setter Property="Template" Value="{x:Null}"/></Style></chartingToolkit:LineSeries.DataPointStyle></chartingToolkit:LineSeries></chartingToolkit:Chart><Button x:Name="Button1" Content="Update" Click="Button1_Click" Height="60"/></StackPanel></Window>

[C# MainWindows.xaml.cs]

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            _time = new DateTime(2014, 4, 1, 0, 0, 0);
            _myData = new MyData();
            Update();
            this.DataContext = _myData;

        }

        private MyData _myData;
        private DateTime _time;

        private void Update()
        {
            // 4時間分のデータを生成する
            List<PointXy> list = new List<PointXy>();
            for (int index = 0; index < 4 * 360; index++)
            {
                DateTime time = _time.AddSeconds(index * 10);
                double value = _time.Hour;
                list.Add(new PointXy(time, value));
            }
            _myData.Update(list);
            _time += TimeSpan.FromHours(4);
        }


        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            Update();
        }
    }

    public class PointXy : INotifyPropertyChanged
    {
        public PointXy(DateTime x, double y) { _x = x; _y = y; }

        public DateTime X
        {
            get { return _x; }
            set
            {
                _x = value;
                OnPropertyChanged("X");
            }
        }
        public double Y
        {
            get { return _y; }
            set
            {
                _y = value;
                OnPropertyChanged("Y");
            }
        }
        private DateTime _x;
        private double _y;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

    public class MyData : INotifyPropertyChanged
    {
        public MyData()
        {
            _items = new ObservableCollection<PointXy>();
        }

        public void Update(List<PointXy> items)
        {

            // 新しいデータを追加する(4時間分 4×360件)
            foreach (PointXy item in items)
            {
                _items.Add(item);
            }
            // 24時間を超過した古いデータを削除する
            int deletenum = Math.Max(_items.Count - 360 * 24, 0);
            for (int index = 0; index < deletenum; index++)
            {
                _items.RemoveAt(0);
            }

            GC.Collect();
            long mem = GC.GetTotalMemory(true);
            Console.WriteLine("データ数={0:#,0}件,メモリ消費量={1:#,0}byte", _items.Count, mem);

            OnPropertyChanged("Items");
            OnPropertyChanged("StartTime");
            OnPropertyChanged("EndTime");
        }

        private ObservableCollection<PointXy> _items;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public ObservableCollection<PointXy> Items { get { return _items; } }

        public DateTime StartTime { get { return _items.First().X; } }

        public DateTime EndTime { get { return _items.Last().X; } }
    }
}

[デバッグコンソールの出力結果]

'WpfApplication1.vshost.exe' (CLR v4.0.30319: WpfApplication1.vshost.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\UIAutomationTypes\v4.0_4.0.0.0__31bf3856ad364e35\UIAutomationTypes.dll' が読み込まれました。シンボルの読み込みをスキップしました。モジュールは最適化されていて、デバッグ オプションの [マイ コードのみ] 設定が有効になっています。
データ数=2,880件,メモリ消費量=14,097,640byte
データ数=4,320件,メモリ消費量=20,088,560byte
データ数=5,760件,メモリ消費量=25,720,888byte
データ数=7,200件,メモリ消費量=31,440,356byte
スレッド 0x1c1c はコード 0 (0x0) で終了しました。
データ数=8,640件,メモリ消費量=37,785,764byte
データ数=8,640件,メモリ消費量=42,862,560byte
データ数=8,640件,メモリ消費量=47,868,180byte
データ数=8,640件,メモリ消費量=54,854,800byte
データ数=8,640件,メモリ消費量=61,161,564byte
データ数=8,640件,メモリ消費量=67,742,752byte
データ数=8,640件,メモリ消費量=74,439,888byte
データ数=8,640件,メモリ消費量=81,277,488byte

[結果]


C#開発者


DataGrid上でドラッグ上で範囲選択している間、ドラッグ方向にスクロールしたい

$
0
0

WPFのデータグリッド上で範囲を選択している場合に、

IEのブラウザや、EXCELのように範囲選択している方向(↑方向か↓方向)にスクロール

させたいのですが、可能なのでしょうか?

XAML上では多分無理だろうとは思うのですが

恥ずかしながら、どんな書き方で作ればいいか検討も付きません。

どなたか、ヒントなりでも頂けないでしょうか


ScrollViewerで範囲選択している間、ドラッグ方向にスクロールしたい

$
0
0

WPFのScrollViewer上で範囲を選択している場合に、

IEのブラウザや、EXCELのように範囲選択している方向(↑方向か↓方向)にスクロール

させたいのですが、可能なのでしょうか?

XAML上では多分無理だろうとは思うのですが

恥ずかしながら、どんな書き方で作ればいいか検討も付きません。

どなたか、ヒントなりでも頂けないでしょうか

TabControlでのTab切り替え時フォーカス設定

$
0
0

TabControlでTabItemが切り替わった時、TabItemに配置されているTextBoxへフォーカスを移動し、キャレットが表示された状態にしたいと思っています。

そこで、TabControlのSelectionChangedイベントで、TextBoxのFocus()を呼び出してみたり、KeyBord.Focus()を呼び出してみたりしましたが、MoveFocus()を呼び出してみましたが、フォーカスが全く移動してくれません。

どのようにすればフォーカスが移動された状態にできるのでしょうか?

環境は以下のようになっています

OS
Windows 8.1
Microsoft Windows [Version 6.3.9600]

開発環境
Microsoft Visual Studio Premium 2012
Version 11.0.61030.00 Update 4
Microsoft .NET Framework
Version 4.5.51641

プロジェクトの対象フレームワーク
.NET Framework 4.5

共通の要素を集約したい

$
0
0

[質問1]
以下の目的でControlTemplateを使うは正しい方法ですか?
ControlTemplateの目的がよく理解できていません。

[質問2]
可読性を高めつつバインドさせる最良の方法は?

[例題]
・DataGrid1とDataGrid2はItemsSourceとx:Nameのみ異なり、他は同じである。
・共通部分をリソースに集約して可読性を高めたい。
・そこでXAML1をXAML2に改変したが、バインドができなくなった。

[XAML2の問題点]
・DataGrid.Columnsを切り出すと、そのままでは、ItemsSourceとの連結が切れてBindingができなくなる。

[XAML1] ※バインドは正常

<Window x:Class="ABC.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="500" Width="500"><Window.Resources></Window.Resources><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="1*"/><ColumnDefinition Width="1*"/></Grid.ColumnDefinitions><ScrollViewer Grid.Row="1"><DataGrid x:Name="DataGrid1" ItemsSource="{Binding GridMessage1,Mode=OneWay}" AutoGenerateColumns="False"><DataGrid.Columns><DataGridTextColumn Header="時刻" Binding="{Binding Time,StringFormat={}{0:HH:mm},Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/><DataGridTextColumn Header="水分" Binding="{Binding WaterAverage,StringFormat={}{0:0.0}%,Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/><DataGridTextColumn Header="温度" Binding="{Binding CnumAverage,StringFormat={}{0:0},Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/></DataGrid.Columns></DataGrid></ScrollViewer><ScrollViewer Grid.Column="1" Grid.Row="1"><DataGrid x:Name="DataGrid2" ItemsSource="{Binding GridMessage2,Mode=OneWay}" AutoGenerateColumns="False"><DataGrid.Columns><DataGridTextColumn Header="時刻" Binding="{Binding Time,StringFormat={}{0:HH:mm},Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/><DataGridTextColumn Header="水分" Binding="{Binding WaterAverage,StringFormat={}{0:0.0}%,Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/><DataGridTextColumn Header="温度" Binding="{Binding CnumAverage,StringFormat={}{0:0},Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/></DataGrid.Columns></DataGrid></ScrollViewer></Grid></Window>

[XAML2] ※バインドできない

<Window x:Class="ABC.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="500" Width="500"><Window.Resources><ControlTemplate x:Key="TestTemplate" TargetType="DataGrid"><DataGrid AutoGenerateColumns="False"><DataGrid.Columns><DataGridTextColumn Header="時刻" Binding="{Binding Time,StringFormat={}{0:HH:mm},Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/><DataGridTextColumn Header="水分" Binding="{Binding WaterAverage,StringFormat={}{0:0.0}%,Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/><DataGridTextColumn Header="温度" Binding="{Binding CnumAverage,StringFormat={}{0:0},Mode=OneWay}" IsReadOnly="True" CanUserResize="True"/></DataGrid.Columns></DataGrid></ControlTemplate></Window.Resources><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="1*"/><ColumnDefinition Width="1*"/></Grid.ColumnDefinitions><ScrollViewer Grid.Row="1"><DataGrid x:Name="DataGrid1" ItemsSource="{Binding GridMessage1,Mode=OneWay}" Template="{StaticResource ResourceKey=TestTemplate}"></DataGrid></ScrollViewer><ScrollViewer Grid.Column="1" Grid.Row="1"><DataGrid x:Name="DataGrid2" ItemsSource="{Binding GridMessage2,Mode=OneWay}" Template="{StaticResource ResourceKey=TestTemplate}"></DataGrid></ScrollViewer></Grid></Window>


C#開発者


Resources.resx参照による実行時のエラー(XamlParseException)について

$
0
0

お世話になります。
Resources.resxで定義した内容をXAMLで使用するためにApplication.Resourcesに以下のような記述を追加しました。

<Application x:Class="Testapp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:properties="clr-namespace:Testapp.Properties"
             StartupUri="MainWindow.xaml" Startup="Application_Startup">
    <Application.Resources>
        <!-- Resourcesに登録しておく -->
        <properties:Resources x:Key="resources" />
    </Application.Resources>
</Application>

これで、XAMLから参照できるようになり、しばらくは問題なく動作していたのですが
いつの頃からか、ビルド後に実行するとソフトウェア起動直後にXamlParseExceptionが発生するようになりました。
ネット上などで同様の問題を探してみたところ、どうもVisualStadioが吐き出すResources.Designer.cs内のResourcesクラスに
原因があることがわかり、このResourcesクラスのコンストラクタをinternalからpublicに変更することで
とりあえず問題が回避できることはわかりました。
しかし、リソースエディタを使ってリソースの変更などを行うと、またVisualStadioはコードを生成し直すため
さきほど直したpublicがinternalに戻ってしまい、同様のエラーが発生してしまいます。
そもそも、自動生成したコードを手動で直すこと自体が気持ち悪いため、根本的な解決を行いたいと考えているのですが
なにが原因でこのような現象が発生するのかわからないため対策できずに困っています。

もし同様の問題が発生して根本的な原因を知っていらっしゃる方がおられましたら教えて頂ければと思います。
よろしくお願い致します。

印刷時にたまに発生する”SelectClipRgn failed" の回避策をご存じでは無いでしょうか?

$
0
0

WPFで印刷を行うプログラムを作成しています。

別WindowでCanvasにRectangleやPathを貼り付けた後に

FixedDocumentにした後、プリンタに送るのですが、

稀に、SelectClipRgn failed と書かれたメッセージ以降に長々と英文が続く エラーメッセージが出力されます。

同じプリンタや、印刷でも出る場合と、出ない場合があり、Try~Chath でも引っかからず、どのように対処していいのか

わからず困っています。どなたかご存じの方がいれば、原因と対策方法をお教えいただけませんでしょうか


Windows7とWindows8で処理速度が異なる??

$
0
0

XAML +VB.NETで開発をしています。

画面にラジオボタンを3つ貼り付け、

値の変更に応じて、処理を行う関数を分岐させているのですが、

Windows7上のPCだと、なんの問題もなく、1秒位で処理が進むのですが

Windows8上で実行すると、画面が固まり、応答なしの状態になります。

メッセージボックスを配置してデバッグしてみても、関数に入る前で固まっているようです。

両方のPCともそんなにスペックが悪いわけではありません。

Windows8上で動かす上で開発の際に気をつける事が何かあるのでしょうか?

ちなみに環境は下記の通りです。

Win7・・・8G 64Bit Core i5

Win8・・・4G  64Bit Core i5

WPFのStaticResourceとDynamicResourceの違い

$
0
0
WPFのStaticResourceとDynamicResourceの違いがどうしても分かりません。どなたかご教授頂けますでしょうか。また、この辺りを学習できるサイトを教えていただけると有難いのですが、いかがでしょうか?

WPFのSpreadsheet

$
0
0

はじめまして.

現在WPFでアプリケーションを作成しています.

そこで Spreadsheet のコントロール(Datagridではないです)を必要としています.

 

Form アプリケーション時代に用いていた自前の Spreadsheet(データの表示速度と大量データのハンドリングのため自前で作成したコントロールを使用していました)を WindowsFormsHost を使って用いてもみましたが,リサイズ時の挙動が耐え難いほどにモタモタするのでこのままでは使用できません.

 

●(これだけでは情報不足とは思いますが,,,) Form コントロールをサクサク使う方法

●WPF で使えるSpreadsheet コントロールの存在情報(市販のもの,どこかのサイトのサンプルなど)

●(1からコントロールを作成することも考えているので)WPF のユーザーコントロール作成のガイドライン(サイト,書籍,,,)

 

このあたりの情報をお持ちの方,是非ご教授お願いします.

NavigationWindow内におけるPageクラスの扱いについて

$
0
0

お世話になります。

MainWindowをNavigationWindowとして、

複数のPageが順番に遷移し、最後まで行くとまた最初のページに戻る、という流れを作っています。

Page1 → Page2 → Page3 → Page4 → Page1 → Page2・・・

このアプリを長時間動かしていると、メモリ不足を起こして最終的にはフリーズしてしまいます。

各画面、遷移の際は遷移元画面のインスタンスやイベントの削除・解放は行っているのですが、他にするべきことがあるのでしょうか。

遷移は各画面とも

if (this.NavigationService != null)
{
  NavigationService.Navigate(new Page1());
}

上記の方法で行っており、リソースの後始末はPage_Unloadedのタイミングで行っています。

[WPF]RichTextBoxの選択時罫線色の消去について

$
0
0

RichTextのマウスオーバー時とフォーカス時の罫線色を消したいと考えていますが、

以下のようにスタイルを設定しても水色の罫線色がついてしまいます。

解決方法がわかるかた教えて頂けませんか?

<RichTextBox>
    <RichTextBox.Style>
        <Style TargetType="RichTextBox">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property = "BorderBrush" Value="Transparent"/>
                </Trigger>
                <Trigger Property="IsFocused" Value="true">
                    <Setter Property = "BorderBrush" Value="Transparent"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </RichTextBox.Style>
    <FlowDocument>
        <Paragraph>aaaaaaaaaa</Paragraph>
    </FlowDocument>
</RichTextBox>


WPFを利用したプログラムに関する質問

$
0
0

再度社内で調査した結果、解決いたしました。

ご回答いただいた皆様、ありがとうございました。


DataGrid.EnableColumnVirtualization=trueに設定した場合の挙動

$
0
0

DataGridを利用したアプリケーションを作成していますが、EnableColumnVirtualizationプロパティとEnableRowVirtualizationプロパティを利用していたところ問題が発生したので質問させてください。

ソースを以下の通りです。

■XAML
<Window x:Class="Art55.DataGridDemo20150122_001.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">
    <Window.Resources>
        <Style TargetType="{x:Type DataGrid}">
            <Setter Property="EnableColumnVirtualization" Value="True" />
            <Setter Property="EnableRowVirtualization" Value="True" />
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="300" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <DataGrid x:Name="DataGrid1" Grid.Column="1" />
        <DataGrid x:Name="DataGrid2" Grid.Column="2" />
    </Grid>
</Window>

■コードビハインド
namespace Art55.DataGridDemo20150122_001
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();

            DataGrid1.ItemsSource = Enumerable
                .Range(1, 100)
                .Select(n => new {Column1 = "A" + n, Column2 = "B" + n, Column3 = "C" + n,})
                .ToList();

            DataGrid2.ItemsSource = Enumerable
                .Range(1, 100)
                .Select(n => new { Column1 = "A" + n, Column2 = "B" + n, Column3 = "C" + n, })
                .ToList();
        }
    }
}

このアプリケーションを実行したところ、マウスにてウインドウのサイズを小さくしていくと、ときどきDataGridの縦スクロールバーが出たり消えたりするようになり、マウス自体は動くのですが、アプリケーションはおろか他のアプリケーションも操作不能になります。おそらく原因はEnableColumnVirtualizationとEnableRowVirtualizationがTureになっていることで、DataGrid中のカラムが見えないサイズになったタイミングで内部のコンテンツがなくなり、スクロールバーが消え、スクロールバーが消えたことにより、内部のコンテンツが描画できるようになり、またスクロールバーが表示されるとうことを繰り返しているのだと思うのですが、操作不能になるのは非常に不味いため、何かの対応をご助言いただきたいと考えています。

※DataGrid.MinWidthを30px程度に指定すると、現象が再現しなくなりましたが、他の方法もないものかと・・・。

Viewing all 711 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>