From ea25056d3d37865c5e3aa9fa0ee3474eb2be3bcb Mon Sep 17 00:00:00 2001 From: MistEO Date: Mon, 22 Nov 2021 23:17:00 +0800 Subject: [PATCH] =?UTF-8?q?refactor.=E8=A7=A3=E8=80=A6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B8=8E=E5=BC=80=E5=A7=8B=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/AsstCaller.h | 16 ++-- src/MeoAssistance/Assistance.cpp | 86 ++++++++++------- src/MeoAssistance/Assistance.h | 30 +++--- src/MeoAssistance/AsstCaller.cpp | 92 ++++++++++++------- src/MeoAsstGui/Helper/AsstProxy.cs | 72 +++++++++------ .../SanityParamSettingUserControl.xaml | 6 +- .../InfrastructureConstructionViewModel.cs | 10 +- .../ViewModels/MainFunctionViewModel.cs | 31 ++++++- src/MeoAsstGui/ViewModels/RecruitViewModel.cs | 3 +- .../Views/InfrastructureConstructionView.xaml | 34 ++++--- src/MeoAsstGui/Views/MainFunctionView.xaml | 6 +- src/MeoAsstGui/Views/RecruitView.xaml | 2 +- src/MeoAsstGui/Views/RootView.xaml | 2 +- tools/TestCaller/main.cpp | 20 ++-- 14 files changed, 256 insertions(+), 154 deletions(-) diff --git a/include/AsstCaller.h b/include/AsstCaller.h index e24c6d1b9b..a6fa31423d 100644 --- a/include/AsstCaller.h +++ b/include/AsstCaller.h @@ -16,14 +16,16 @@ extern "C" { bool MEOAPI AsstCatchCustom(void* p_asst); bool MEOAPI AsstCatchFake(void* p_asst); - bool MEOAPI AsstStartSanity(void* p_asst); - bool MEOAPI AsstStartVisit(void* p_asst, bool with_shopping); - bool MEOAPI AsstStartProcessTask(void* p_asst, const char* task); - bool MEOAPI AsstStartRecruiting(void* p_asst, const int required_level[], int required_len, bool set_time); - bool MEOAPI AsstStartInfrastShift(void* p_asst, int work_mode, const char** order, int order_size, int uses_of_drones, double dorm_threshold); - bool MEOAPI AsstStartDebugTask(void* p_asst); + bool MEOAPI AsstAppendSanity(void* p_asst); + bool MEOAPI AsstAppendReceiveAward(void* p_asst); + bool MEOAPI AsstAppendVisit(void* p_asst, bool with_shopping); + bool MEOAPI AsstAppendProcessTask(void* p_asst, const char* task); + bool MEOAPI AsstAppendRecruiting(void* p_asst, const int required_level[], int required_len, bool set_time); + bool MEOAPI AsstAppendInfrastShift(void* p_asst, int work_mode, const char** order, int order_size, int uses_of_drones, double dorm_threshold); + bool MEOAPI AsstAppendDebugTask(void* p_asst); - void MEOAPI AsstStop(void* p_asst); + bool MEOAPI AsstStart(void* p_asst); + bool MEOAPI AsstStop(void* p_asst); bool MEOAPI AsstSetParam(void* p_asst, const char* type, const char* param, const char* value); MEOAPI_PORT const char* MEO_CALL AsstGetVersion(); diff --git a/src/MeoAssistance/Assistance.cpp b/src/MeoAssistance/Assistance.cpp index 8c2f6ce1cd..542e169c14 100644 --- a/src/MeoAssistance/Assistance.cpp +++ b/src/MeoAssistance/Assistance.cpp @@ -139,15 +139,20 @@ bool asst::Assistance::catch_fake() return true; } -bool asst::Assistance::start_sanity() +bool asst::Assistance::append_sanity(bool only_append) { - return start_process_task("SanityBegin", ProcessTaskRetryTimesDefault); + return append_process_task("SanityBegin", ProcessTaskRetryTimesDefault, only_append); } -bool asst::Assistance::start_visit(bool with_shopping) +bool asst::Assistance::append_receive_award(bool only_append) +{ + return append_process_task("AwardBegin", ProcessTaskRetryTimesDefault, only_append); +} + +bool asst::Assistance::append_visit(bool with_shopping, bool only_append) { LogTraceFunction; - if (!m_thread_idle || !m_inited) { + if (!m_inited) { return false; } @@ -162,40 +167,36 @@ bool asst::Assistance::start_visit(bool with_shopping) m_tasks_deque.emplace_back(shopping_task_ptr); } - m_thread_idle = false; - m_condvar.notify_one(); + if (!only_append) { + start(false); + } return true; } -bool Assistance::start_process_task(const std::string& task, int retry_times, bool block) +bool Assistance::append_process_task(const std::string& task, int retry_times, bool only_append) { LogTraceFunction; - log.trace("Start |", task, block ? "block" : "non block"); - if (!m_thread_idle || !m_inited) { + if (!m_inited) { return false; } - std::unique_lock lock; - if (block) { - lock = std::unique_lock(m_mutex); - //clear_exec_times(); - resource.templ().clear_hists(); - } + std::unique_lock lock(m_mutex); append_match_task(task, { task }, retry_times); - m_thread_idle = false; - m_condvar.notify_one(); + if (!only_append) { + start(false); + } return true; } #ifdef LOG_TRACE -bool Assistance::start_debug_task() +bool Assistance::append_debug_task() { LogTraceFunction; - if (!m_thread_idle || !m_inited) { + if (!m_inited) { return false; } @@ -211,17 +212,14 @@ bool Assistance::start_debug_task() m_tasks_deque.emplace_back(shift_task_ptr); } - m_thread_idle = false; - m_condvar.notify_one(); - return true; } #endif -bool Assistance::start_recruiting(const std::vector& required_level, bool set_time) +bool Assistance::append_recruiting(const std::vector& required_level, bool set_time, bool only_append) { LogTraceFunction; - if (!m_thread_idle || !m_inited) { + if (!m_inited) { return false; } @@ -233,16 +231,17 @@ bool Assistance::start_recruiting(const std::vector& required_level, bool s task_ptr->set_task_chain("OpenRecruit"); m_tasks_deque.emplace_back(task_ptr); - m_thread_idle = false; - m_condvar.notify_one(); + if (!only_append) { + start(false); + } return true; } -bool asst::Assistance::start_infrast_shift(infrast::WorkMode work_mode, const std::vector& order, UsesOfDrones uses_of_drones, double dorm_threshold) +bool asst::Assistance::append_infrast_shift(infrast::WorkMode work_mode, const std::vector& order, UsesOfDrones uses_of_drones, double dorm_threshold, bool only_append) { LogTraceFunction; - if (!m_thread_idle || !m_inited) { + if (!m_inited) { return false; } @@ -258,6 +257,8 @@ bool asst::Assistance::start_infrast_shift(infrast::WorkMode work_mode, const st auto info_task_ptr = std::make_shared(task_callback, (void*)this); info_task_ptr->set_work_mode(work_mode); + info_task_ptr->set_task_chain(InfrastTaskCahin); + m_tasks_deque.emplace_back(info_task_ptr); // 因为后期要考虑多任务间的联动等,所以这些任务的声明暂时不妨到for循环中 @@ -307,18 +308,38 @@ bool asst::Assistance::start_infrast_shift(infrast::WorkMode work_mode, const st m_tasks_deque.emplace_back(recpt_task_ptr); } else { - log.error("start_infrast_shift | Unknown facility", facility); + log.error("append_infrast_shift | Unknown facility", facility); } append_match_task(InfrastTaskCahin, { "InfrastBegin" }); } + if (!only_append) { + start(false); + } + + return true; +} + +bool asst::Assistance::start(bool block) +{ + LogTraceFunction; + log.trace("Start |", block ? "block" : "non block"); + + if (!m_thread_idle || !m_inited) { + return false; + } + std::unique_lock lock; + if (block) { // 外部调用 + lock = std::unique_lock(m_mutex); + } + m_thread_idle = false; m_condvar.notify_one(); return true; } -void Assistance::stop(bool block) +bool Assistance::stop(bool block) { LogTraceFunction; log.trace("Stop |", block ? "block" : "non block"); @@ -333,6 +354,8 @@ void Assistance::stop(bool block) m_tasks_deque.swap(empty); clear_exec_times(); resource.templ().clear_hists(); + + return true; } bool Assistance::set_param(const std::string& type, const std::string& param, const std::string& value) @@ -365,7 +388,8 @@ void Assistance::working_proc() bool ret = task_ptr->run(); if (ret) { retry_times = 0; - if (m_tasks_deque.empty()) { + if (m_tasks_deque.empty() + || task_ptr->get_task_chain() != m_tasks_deque.front()->get_task_chain()) { json::value task_all_completed_json; task_all_completed_json["task_chain"] = task_ptr->get_task_chain(); task_callback(AsstMsg::TaskChainCompleted, task_all_completed_json, p_this); diff --git a/src/MeoAssistance/Assistance.h b/src/MeoAssistance/Assistance.h index f12a3fa30b..7b6da61416 100644 --- a/src/MeoAssistance/Assistance.h +++ b/src/MeoAssistance/Assistance.h @@ -39,24 +39,30 @@ namespace asst // 不实际进行捕获,调试用接口 bool catch_fake(); - // 开始刷理智 - bool start_sanity(); - // 开始访问好友基建 - bool start_visit(bool with_shopping = false); + // 添加刷理智任务 + bool append_sanity(bool only_append = true); + // 添加领取日常任务奖励任务 + bool append_receive_award(bool only_append = true); + // 添加访问好友基建任务 + bool append_visit(bool with_shopping, bool only_append = true); - // 开始公开招募操作 - bool start_recruiting(const std::vector& required_level, bool set_time = true); - // 开始基建换班任务 - bool start_infrast_shift(infrast::WorkMode work_mode, const std::vector& order, UsesOfDrones uses, double dorm_threshold); + // 添加公开招募操作任务 + bool append_recruiting(const std::vector& required_level, bool set_time, bool only_append = true); + // 添加基建换班任务任务 + bool append_infrast_shift(infrast::WorkMode work_mode, const std::vector& order, UsesOfDrones uses, double dorm_threshold, bool only_append = true); + + // 添加流程任务,应该是private的,调试用临时放到public + bool append_process_task(const std::string& task, int retry_times = ProcessTaskRetryTimesDefault, bool only_append = true); - // 开始流程任务,应该是private的,调试用临时放到public - bool start_process_task(const std::string& task, int retry_times = ProcessTaskRetryTimesDefault, bool block = true); #ifdef LOG_TRACE // 调试用 - bool start_debug_task(); + bool append_debug_task(); #endif - void stop(bool block = true); + // 开始执行任务队列 + bool start(bool block = true); + // 停止任务队列并清空 + bool stop(bool block = true); bool set_param(const std::string& type, const std::string& param, const std::string& value); diff --git a/src/MeoAssistance/AsstCaller.cpp b/src/MeoAssistance/AsstCaller.cpp index fcf7e23b91..5f20a3aaa1 100644 --- a/src/MeoAssistance/AsstCaller.cpp +++ b/src/MeoAssistance/AsstCaller.cpp @@ -112,40 +112,85 @@ bool AsstCatchFake(void* p_asst) #endif // LOG_TRACE } -bool AsstStartSanity(void* p_asst) +bool AsstAppendSanity(void* p_asst) { if (p_asst == nullptr) { return false; } - return ((asst::Assistance*)p_asst)->start_sanity(); -} - -bool AsstStartVisit(void* p_asst, bool with_shopping) + return ((asst::Assistance*)p_asst)->append_sanity(); +} + +bool AsstAppendReceiveAward(void* p_asst) { if (p_asst == nullptr) { return false; } - return ((asst::Assistance*)p_asst)->start_visit(with_shopping); + return ((asst::Assistance*)p_asst)->append_receive_award(); } -bool AsstStartProcessTask(void* p_asst, const char* task) +bool AsstAppendVisit(void* p_asst, bool with_shopping) { if (p_asst == nullptr) { return false; } - return ((asst::Assistance*)p_asst)->start_process_task(task, asst::Assistance::ProcessTaskRetryTimesDefault); + return ((asst::Assistance*)p_asst)->append_visit(with_shopping); } -void AsstStop(void* p_asst) +bool AsstAppendProcessTask(void* p_asst, const char* task) { if (p_asst == nullptr) { - return; + return false; } - ((asst::Assistance*)p_asst)->stop(); + return ((asst::Assistance*)p_asst)->append_process_task(task, asst::Assistance::ProcessTaskRetryTimesDefault); +} + + +bool AsstAppendRecruiting(void* p_asst, const int required_level[], int required_len, bool set_time) +{ + if (p_asst == nullptr) { + return false; + } + std::vector level_vector; + level_vector.assign(required_level, required_level + required_len); + return ((asst::Assistance*)p_asst)->append_recruiting(level_vector, set_time); +} + +bool AsstAppendInfrastShift(void* p_asst, int work_mode, const char** order, int order_size, int uses_of_drones, double dorm_threshold) +{ + if (p_asst == nullptr) { + return false; + } + std::vector order_vector; + order_vector.assign(order, order + order_size); + + return ((asst::Assistance*)p_asst)-> + append_infrast_shift( + static_cast(work_mode), + order_vector, + static_cast(uses_of_drones), + dorm_threshold); +} + +bool AsstStart(void* p_asst) +{ + if (p_asst == nullptr) { + return false; + } + + return ((asst::Assistance*)p_asst)->start(); +} + +bool AsstStop(void* p_asst) +{ + if (p_asst == nullptr) { + return false; + } + + return ((asst::Assistance*)p_asst)->stop(); } bool AsstSetParam(void* p_asst, const char* type, const char* param, const char* value) @@ -162,34 +207,13 @@ const char* AsstGetVersion() return asst::Version; } -bool AsstStartRecruiting(void* p_asst, const int required_level[], int required_len, bool set_time) -{ - if (p_asst == nullptr) { - return false; - } - std::vector level_vector; - level_vector.assign(required_level, required_level + required_len); - return ((asst::Assistance*)p_asst)->start_recruiting(level_vector, set_time); -} - -bool AsstStartInfrastShift(void* p_asst, int work_mode, const char** order, int order_size, int uses_of_drones, double dorm_threshold) -{ - if (p_asst == nullptr) { - return false; - } - std::vector order_vector; - order_vector.assign(order, order + order_size); - - return ((asst::Assistance*)p_asst)->start_infrast_shift(static_cast(work_mode), order_vector, static_cast(uses_of_drones), dorm_threshold); -} - -bool AsstStartDebugTask(void* p_asst) +bool AsstAppendDebugTask(void* p_asst) { if (p_asst == nullptr) { return false; } #if LOG_TRACE - return ((asst::Assistance*)p_asst)->start_debug_task(); + return ((asst::Assistance*)p_asst)->append_debug_task(); #else return false; #endif // LOG_TRACE diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index c3fd6de063..ff52478c97 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -23,17 +23,19 @@ namespace MeoAsstGui [DllImport("MeoAssistance.dll")] private static extern bool AsstCatchDefault(IntPtr ptr); - [DllImport("MeoAssistance.dll")] private static extern bool AsstStartProcessTask(IntPtr ptr, string task); + [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendProcessTask(IntPtr ptr, string task); - [DllImport("MeoAssistance.dll")] private static extern bool AsstStartSanity(IntPtr ptr); + [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendSanity(IntPtr ptr); + [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendReceiveAward(IntPtr ptr); - [DllImport("MeoAssistance.dll")] private static extern bool AsstStartVisit(IntPtr ptr, bool with_shopping); + [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendVisit(IntPtr ptr, bool with_shopping); - [DllImport("MeoAssistance.dll")] private static extern bool AsstStartRecruiting(IntPtr ptr, int[] required_level, int required_len, bool set_time); + [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendRecruiting(IntPtr ptr, int[] required_level, int required_len, bool set_time); - [DllImport("MeoAssistance.dll")] private static extern bool AsstStartInfrastShift(IntPtr ptr, int work_mode, string[] order, int order_len, int uses_of_drones, double dorm_threshold); + [DllImport("MeoAssistance.dll")] private static extern bool AsstAppendInfrastShift(IntPtr ptr, int work_mode, string[] order, int order_len, int uses_of_drones, double dorm_threshold); - [DllImport("MeoAssistance.dll")] private static extern void AsstStop(IntPtr ptr); + [DllImport("MeoAssistance.dll")] private static extern bool AsstStart(IntPtr ptr); + [DllImport("MeoAssistance.dll")] private static extern bool AsstStop(IntPtr ptr); [DllImport("MeoAssistance.dll")] private static extern bool AsstSetParam(IntPtr p_asst, string type, string param, string value); @@ -104,10 +106,14 @@ namespace MeoAsstGui case AsstMsg.TaskStart: { string taskChain = detail["task_chain"].ToString(); - string taskType = detail["task_type"].ToString(); if (taskChain == "SanityBegin" || taskChain == "VisitBegin") { mfvm.RunStatus = "正在运行中……"; + } + else if (taskChain == "Infrast") + { + var ifvm = _container.Get(); + ifvm.StatusPrompt = "正在运行中……"; } } break; @@ -187,7 +193,7 @@ namespace MeoAsstGui { //AsstStop(); System.Threading.Thread.Sleep(2000); - AsstStartSanity(); + AsstAppendSanity(); }); } } @@ -283,12 +289,7 @@ namespace MeoAsstGui } break; } - } - - public void AsstStop() - { - AsstStop(_ptr); - } + } private bool _isCatched = false; @@ -301,30 +302,47 @@ namespace MeoAsstGui return _isCatched; } - public bool AsstStartSanity() + public bool AsstAppendSanity() { - return AsstStartSanity(_ptr); + return AsstAppendSanity(_ptr); + } + + public bool AsstAppendReceiveAward() + { + return AsstAppendReceiveAward(_ptr); } - public bool AsstStartVisit(bool with_shopping) + public bool AsstAppendVisit(bool with_shopping) { - return AsstStartVisit(_ptr, with_shopping); + return AsstAppendVisit(_ptr, with_shopping); + } + + public bool AsstAppendRecruiting(int[] required_level, int required_len, bool set_time) + { + return AsstAppendRecruiting(_ptr, required_level, required_len, set_time); + } + + public bool AsstAppendInfrastShift(int work_mode, string[] order, int order_len, int uses_of_drones, double dorm_threshold) + { + return AsstAppendInfrastShift(_ptr, work_mode, order, order_len, uses_of_drones, dorm_threshold); + } + + public bool AsstStart() + { + return AsstStart(_ptr); } + public bool AsstStop() + { + return AsstStop(_ptr); + } + + public void AsstSetParam(string type, string param, string value) { AsstSetParam(_ptr, type, param, value); } - public bool AsstStartRecruiting(int[] required_level, int required_len, bool set_time) - { - return AsstStartRecruiting(_ptr, required_level, required_len, set_time); - } - - public bool AsstStartInfrastShift(int work_mode, string[] order, int order_len, int uses_of_drones, double dorm_threshold) - { - return AsstStartInfrastShift(_ptr, work_mode, order, order_len, uses_of_drones, dorm_threshold); - } } public enum AsstMsg diff --git a/src/MeoAsstGui/UserControl/SanityParamSettingUserControl.xaml b/src/MeoAsstGui/UserControl/SanityParamSettingUserControl.xaml index d39614e4d4..4f1be52249 100644 --- a/src/MeoAsstGui/UserControl/SanityParamSettingUserControl.xaml +++ b/src/MeoAsstGui/UserControl/SanityParamSettingUserControl.xaml @@ -5,13 +5,14 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:hc="https://handyorg.github.io/handycontrol" mc:Ignorable="d" - d:DesignHeight="200" d:DesignWidth="500"> + d:DesignHeight="280" d:DesignWidth="500"> + @@ -37,6 +38,7 @@ - + + \ No newline at end of file diff --git a/src/MeoAsstGui/ViewModels/InfrastructureConstructionViewModel.cs b/src/MeoAsstGui/ViewModels/InfrastructureConstructionViewModel.cs index 589b47478f..41fa488bfc 100644 --- a/src/MeoAsstGui/ViewModels/InfrastructureConstructionViewModel.cs +++ b/src/MeoAsstGui/ViewModels/InfrastructureConstructionViewModel.cs @@ -230,10 +230,14 @@ namespace MeoAsstGui orderList.Add(facility_key[item.Name]); } - bool ret = asstProxy.AsstStartInfrastShift((int)work_mode, orderList.ToArray(), orderList.Count, (int)uses_of_drones, DormThreshold / 100.0); - if (ret) + bool ret = asstProxy.AsstAppendInfrastShift( + (int)work_mode, orderList.ToArray(), orderList.Count, (int)uses_of_drones, DormThreshold / 100.0); + + ret &= asstProxy.AsstStart(); + + if (!ret) { - StatusPrompt = "正在运行中……"; + StatusPrompt = "出现未知错误"; } } diff --git a/src/MeoAsstGui/ViewModels/MainFunctionViewModel.cs b/src/MeoAsstGui/ViewModels/MainFunctionViewModel.cs index d6e0dbf7b2..d0ca9d3cf7 100644 --- a/src/MeoAsstGui/ViewModels/MainFunctionViewModel.cs +++ b/src/MeoAsstGui/ViewModels/MainFunctionViewModel.cs @@ -71,6 +71,17 @@ namespace MeoAsstGui SetAndNotify(ref _runStatus, value); } } + private bool _receiveAward = System.Convert.ToBoolean(ViewStatusStorage.Get("MainFunction.ReceiveAward", bool.TrueString)); + public bool ReceiveAward + { + get { return _receiveAward; } + set + { + ViewStatusStorage.Set("MainFunction.ReceiveAward", value.ToString()); + SetAndNotify(ref _receiveAward, value); + } + } + private bool _shutdown; @@ -278,9 +289,16 @@ namespace MeoAsstGui { RunStatus = "捕获模拟器窗口失败,若是第一次运行,请尝试使用管理员权限"; return; - } - if (!asstProxy.AsstStartSanity()) + } + bool startRet = asstProxy.AsstAppendSanity(); + if (ReceiveAward) + { + startRet &= asstProxy.AsstAppendReceiveAward(); + } + startRet &= asstProxy.AsstStart(); + if (!startRet) { + RunStatus = "开始失败,出现未知错误"; return; } ExecInfo = ""; @@ -307,9 +325,12 @@ namespace MeoAsstGui { RunStatus = "捕获模拟器窗口失败,若是第一次运行,请尝试使用管理员权限"; return; - } - if (!asstProxy.AsstStartVisit(CreditShopping)) - { + } + bool start_ret = asstProxy.AsstAppendVisit(CreditShopping) + && asstProxy.AsstStart(); + if (!start_ret) + { + RunStatus = "出现未知错误"; return; } CreditShoppingCheckBoxIsEnable = false; diff --git a/src/MeoAsstGui/ViewModels/RecruitViewModel.cs b/src/MeoAsstGui/ViewModels/RecruitViewModel.cs index 5f8533dd4a..83853d6950 100644 --- a/src/MeoAsstGui/ViewModels/RecruitViewModel.cs +++ b/src/MeoAsstGui/ViewModels/RecruitViewModel.cs @@ -135,7 +135,8 @@ namespace MeoAsstGui levelList.Add(6); } - asstProxy.AsstStartRecruiting(levelList.ToArray(), levelList.Count, AutoSetTime); + asstProxy.AsstAppendRecruiting(levelList.ToArray(), levelList.Count, AutoSetTime); + asstProxy.AsstStart(); } } } diff --git a/src/MeoAsstGui/Views/InfrastructureConstructionView.xaml b/src/MeoAsstGui/Views/InfrastructureConstructionView.xaml index f191c5a7f5..4990516648 100644 --- a/src/MeoAsstGui/Views/InfrastructureConstructionView.xaml +++ b/src/MeoAsstGui/Views/InfrastructureConstructionView.xaml @@ -6,11 +6,12 @@ xmlns:s="https://github.com/canton7/Stylet" xmlns:dd="urn:gong-wpf-dragdrop" mc:Ignorable="d" - Height="350" Width="750"> + Height="460" Width="750"> - - + + + @@ -49,23 +50,20 @@ - - - - - - - - - - - -