优化更新

This commit is contained in:
Hakoyu 2023-09-16 02:57:39 +08:00
parent ba969f91f3
commit b34d44194f
44 changed files with 632 additions and 162 deletions

View File

@ -23,6 +23,14 @@ namespace VPet.ModMaker.Converters;
/// <Binding Source="/" /> /// <Binding Source="/" />
/// <Binding Path="Num5" /> /// <Binding Path="Num5" />
/// </MultiBinding> /// </MultiBinding>
/// //
/// <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="+-*/">
/// <Binding Path="Num1" />
/// <Binding Path="Num2" />
/// <Binding Path="Num3" />
/// <Binding Path="Num4" />
/// <Binding Path="Num5" />
/// </MultiBinding>
/// ]]></code></para> /// ]]></code></para>
/// </summary> /// </summary>
/// <exception cref="Exception">绑定的数量不正确</exception> /// <exception cref="Exception">绑定的数量不正确</exception>
@ -30,28 +38,40 @@ public class CalculatorConverter : IMultiValueConverter
{ {
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{ {
if (System.Convert.ToBoolean(values.Length & 1) is false)
throw new Exception("Parameter error: Incorrect quantity");
if (values.Length == 1) if (values.Length == 1)
return values[0]; return values[0];
bool isNumber = false; double result = System.Convert.ToDouble(values[0]);
double result = (double)values[0]; if (parameter is string operators)
char currentOperator = '0';
for (int i = 1; i < values.Length - 1; i++)
{ {
if (isNumber is false) if (operators.Length != values.Length - 1)
{ throw new Exception("Parameter error: operator must be one more than parameter");
currentOperator = ((string)values[i])[0]; for (int i = 1; i < values.Length - 1; i++)
isNumber = true; result = Operation(result, operators[i - 1], System.Convert.ToDouble(values[i]));
} result = Operation(result, operators.Last(), System.Convert.ToDouble(values.Last()));
else
{
var value = System.Convert.ToDouble(values[i]);
result = Operation(result, currentOperator, value);
isNumber = false;
}
} }
return Operation(result, currentOperator, System.Convert.ToDouble(values.Last())); else
{
if (System.Convert.ToBoolean(values.Length & 1) is false)
throw new Exception("Parameter error: Incorrect quantity");
bool isNumber = false;
char currentOperator = '0';
for (int i = 1; i < values.Length - 1; i++)
{
if (isNumber is false)
{
currentOperator = ((string)values[i])[0];
isNumber = true;
}
else
{
var value = System.Convert.ToDouble(values[i]);
result = Operation(result, currentOperator, value);
isNumber = false;
}
}
result = Operation(result, currentOperator, System.Convert.ToDouble(values.Last()));
}
return result;
} }
public static double Operation(double value1, char operatorChar, double value2) public static double Operation(double value1, char operatorChar, double value2)
@ -62,6 +82,7 @@ public class CalculatorConverter : IMultiValueConverter
'-' => value1 - value2, '-' => value1 - value2,
'*' => value1 * value2, '*' => value1 * value2,
'/' => value1 / value2, '/' => value1 / value2,
'%' => value1 % value2,
_ => throw new NotImplementedException(), _ => throw new NotImplementedException(),
}; };
} }

View File

@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace VPet.ModMaker.Models; namespace VPet.ModMaker.Models;
public class EnumFlagsVM<T> public class ObservableEnumFlagsVM<T>
where T : Enum where T : Enum
{ {
public ObservableValue<T> EnumValue { get; } = new(); public ObservableValue<T> EnumValue { get; } = new();
@ -18,13 +18,13 @@ public class EnumFlagsVM<T>
public Type EnumType = typeof(T); public Type EnumType = typeof(T);
public Type UnderlyingType { get; } = Enum.GetUnderlyingType(typeof(T)); public Type UnderlyingType { get; } = Enum.GetUnderlyingType(typeof(T));
public EnumFlagsVM() public ObservableEnumFlagsVM()
{ {
AddCommand.ExecuteEvent += AddCommand_ExecuteEvent; AddCommand.ExecuteEvent += AddCommand_ExecuteEvent;
RemoveCommand.ExecuteEvent += RemoveCommand_ExecuteEvent; RemoveCommand.ExecuteEvent += RemoveCommand_ExecuteEvent;
} }
public EnumFlagsVM(T value) public ObservableEnumFlagsVM(T value)
: this() : this()
{ {
EnumValue.Value = value; EnumValue.Value = value;

View File

@ -94,14 +94,12 @@ public class ModLoader
var name = lps.First().Info; var name = lps.First().Info;
var pet = new PetLoader(lps, di); var pet = new PetLoader(lps, di);
Pets.Add(pet); Pets.Add(pet);
// 此方法会导致 LoadImageToStream 无法使用 // TODO : 此方法会导致 LoadImageToStream 无法使用
//var graphCore = new GraphCore(0); //var graphCore = new GraphCore(0);
//foreach (var p in pet.path) //foreach (var p in pet.path)
// PetLoader.LoadGraph(graphCore, di, p); // PetLoader.LoadGraph(graphCore, di, p);
//MultiGraphs.Add(pet.Name, graphCore); //MultiGraphs.Add(pet.Name, graphCore);
//var p = mw.Pets.FirstOrDefault(x => x.Id == name); //var p = mw.Pets.FirstOrDefault(x => x.Id == name);
//if (p == null) //if (p == null)
// mw.Pets.Add(new PetLoader(lps, di)); // mw.Pets.Add(new PetLoader(lps, di));
@ -202,7 +200,7 @@ public class ModLoader
foreach (var item in lps) foreach (var item in lps)
{ {
if (OtherI18nDatas[dis.Name].ContainsKey(item.Name) is false) if (OtherI18nDatas[dis.Name].ContainsKey(item.Name) is false)
OtherI18nDatas[dis.Name].Add(item.Name, item.Info); OtherI18nDatas[dis.Name].TryAdd(item.Name, item.Info);
} }
} }
} }

View File

@ -14,24 +14,149 @@ namespace VPet.ModMaker.Models.ModModel;
public class AnimeModel public class AnimeModel
{ {
public ObservableValue<string> Id { get; } = new(); public static ObservableCollection<GraphInfo.GraphType> GraphTypes { get; } =
public ObservableValue<GraphInfo.AnimatType> AnimeType { get; } = new(); new(Enum.GetValues(typeof(GraphInfo.GraphType)).Cast<GraphInfo.GraphType>());
public static ObservableCollection<GraphInfo.AnimatType> AnimatTypes { get; } =
new(Enum.GetValues(typeof(GraphInfo.AnimatType)).Cast<GraphInfo.AnimatType>());
public ObservableCollection<ObservableCollection<ImageModel>> MultiHappyImageModels = new(); public static ObservableCollection<GameSave.ModeType> ModeTypes { get; } =
public ObservableCollection<ObservableCollection<ImageModel>> MultiNomalImageModels = new(); new(Enum.GetValues(typeof(GameSave.ModeType)).Cast<GameSave.ModeType>());
public ObservableCollection<ObservableCollection<ImageModel>> MultiPoorConditionImageModels =
new(); public ObservableValue<string> Id { get; } = new();
public ObservableCollection<ObservableCollection<ImageModel>> MultiIllImageModels = new();
public ObservableValue<GraphInfo.GraphType> GraphType { get; } = new();
public ObservableValue<GraphInfo.AnimatType> AnimeType { get; } = new();
public ObservableValue<GameSave.ModeType> ModeType { get; } = new();
public ObservableCollection<ImageModels> MultiHappyImageModels = new();
public ObservableCollection<ImageModels> MultiNomalImageModels = new();
public ObservableCollection<ImageModels> MultiPoorConditionImageModels = new();
public ObservableCollection<ImageModels> MultiIllImageModels = new();
public AnimeModel() { } public AnimeModel() { }
public AnimeModel(string name, AnimatType animatType, IList<IGraph> graphList) //public AnimeModel()
//{
//}
public static AnimeModel? Load(string path)
{ {
Id.Value = name; var model = new AnimeModel();
AnimeType.Value = animatType; var infoFile = Path.Combine(path, ModMakerInfo.InfoFile);
foreach (IGraph graph in graphList)
if (
Enum.TryParse<GraphInfo.GraphType>(Path.GetFileName(path), true, out var graphType)
is false
)
return null;
if (graphType is GraphInfo.GraphType.Default)
{ {
//if(graph.) foreach (var dir in Directory.EnumerateDirectories(path))
{
var dirName = Path.GetFileName(dir);
if (
dirName.Contains(
nameof(GameSave.ModeType.Happy),
StringComparison.OrdinalIgnoreCase
)
)
{
if (Directory.GetFiles(dir).Length == 0)
{
foreach (var imageDir in Directory.EnumerateDirectories(dir))
{
model.MultiHappyImageModels.Add(new(imageDir));
}
}
else
{
model.MultiHappyImageModels.Add(new(dir));
}
}
else if (
dirName.Contains(
nameof(GameSave.ModeType.Nomal),
StringComparison.OrdinalIgnoreCase
)
)
{
if (Directory.GetFiles(dir).Length == 0)
{
foreach (var imageDir in Directory.EnumerateDirectories(dir))
{
model.MultiNomalImageModels.Add(new(imageDir));
}
}
else
{
model.MultiNomalImageModels.Add(new(dir));
}
}
else if (
dirName.Contains(
nameof(GameSave.ModeType.PoorCondition),
StringComparison.OrdinalIgnoreCase
)
)
{
if (Directory.GetFiles(dir).Length == 0)
{
foreach (var imageDir in Directory.EnumerateDirectories(dir))
{
model.MultiPoorConditionImageModels.Add(new(imageDir));
}
}
else
{
model.MultiPoorConditionImageModels.Add(new(dir));
}
}
else if (
dirName.Contains(
nameof(GameSave.ModeType.Ill),
StringComparison.OrdinalIgnoreCase
)
)
{
if (Directory.GetFiles(dir).Length == 0)
{
foreach (var imageDir in Directory.EnumerateDirectories(dir))
{
model.MultiIllImageModels.Add(new(imageDir));
}
}
else
{
model.MultiIllImageModels.Add(new(dir));
}
}
}
}
else
return null;
return model;
}
}
public class ImageModels : ObservableCollection<ImageModel>
{
private static readonly char[] _splits = new char[] { '_' };
public ImageModels(string imagePath)
{
foreach (var file in Directory.EnumerateFiles(imagePath))
{
var info = Path.GetFileNameWithoutExtension(file)
.Split(_splits, StringSplitOptions.RemoveEmptyEntries);
var id = info[0];
var duration = info.Last();
var imageModel = new ImageModel();
imageModel.Id.Value = id;
imageModel.Image.Value = Utils.LoadImageToMemoryStream(file);
imageModel.Duration.Value = int.Parse(duration);
Add(imageModel);
} }
} }
} }

View File

@ -24,9 +24,9 @@ public class ClickTextModel : I18nModel<I18nClickTextModel>
public ObservableValue<string> Id { get; } = new(); public ObservableValue<string> Id { get; } = new();
public ObservableValue<string> Working { get; } = new(); public ObservableValue<string> Working { get; } = new();
public ObservableValue<ClickText.ModeType> Mode { get; } = new(); public ObservableEnumFlagsVM<ClickText.ModeType> Mode { get; } = new();
public ObservableValue<VPet_Simulator.Core.Main.WorkingState> WorkingState { get; } = new(); public ObservableValue<VPet_Simulator.Core.Main.WorkingState> WorkingState { get; } = new();
public ObservableValue<ClickText.DayTime> DayTime { get; } = new(); public ObservableEnumFlagsVM<ClickText.DayTime> DayTime { get; } = new();
public ObservableRange<double> Like { get; } = new(0, int.MaxValue); public ObservableRange<double> Like { get; } = new(0, int.MaxValue);
public ObservableRange<double> Health { get; } = new(0, int.MaxValue); public ObservableRange<double> Health { get; } = new(0, int.MaxValue);
@ -43,10 +43,10 @@ public class ClickTextModel : I18nModel<I18nClickTextModel>
: this() : this()
{ {
Id.Value = clickText.Id.Value; Id.Value = clickText.Id.Value;
Mode.Value = clickText.Mode.Value; Mode.EnumValue.Value = clickText.Mode.EnumValue.Value;
Working.Value = clickText.Working.Value; Working.Value = clickText.Working.Value;
WorkingState.Value = clickText.WorkingState.Value; WorkingState.Value = clickText.WorkingState.Value;
DayTime.Value = clickText.DayTime.Value; DayTime.EnumValue.Value = clickText.DayTime.EnumValue.Value;
Like = clickText.Like.Copy(); Like = clickText.Like.Copy();
Health = clickText.Health.Copy(); Health = clickText.Health.Copy();
Level = clickText.Level.Copy(); Level = clickText.Level.Copy();
@ -64,10 +64,10 @@ public class ClickTextModel : I18nModel<I18nClickTextModel>
: this() : this()
{ {
Id.Value = clickText.Text; Id.Value = clickText.Text;
Mode.Value = clickText.Mode; Mode.EnumValue.Value = clickText.Mode;
Working.Value = clickText.Working; Working.Value = clickText.Working;
WorkingState.Value = clickText.State; WorkingState.Value = clickText.State;
DayTime.Value = clickText.DaiTime; DayTime.EnumValue.Value = clickText.DaiTime;
Like.SetValue(clickText.LikeMin, clickText.LikeMax); Like.SetValue(clickText.LikeMin, clickText.LikeMax);
Health.SetValue(clickText.HealthMin, clickText.HealthMax); Health.SetValue(clickText.HealthMin, clickText.HealthMax);
Level.SetValue(clickText.LevelMin, clickText.LevelMax); Level.SetValue(clickText.LevelMin, clickText.LevelMax);
@ -83,10 +83,10 @@ public class ClickTextModel : I18nModel<I18nClickTextModel>
return new() return new()
{ {
Text = Id.Value, Text = Id.Value,
Mode = Mode.Value, Mode = Mode.EnumValue.Value,
Working = Working.Value, Working = Working.Value,
State = WorkingState.Value, State = WorkingState.Value,
DaiTime = DayTime.Value, DaiTime = DayTime.EnumValue.Value,
LikeMax = Like.Max.Value, LikeMax = Like.Max.Value,
LikeMin = Like.Min.Value, LikeMin = Like.Min.Value,
HealthMin = Health.Min.Value, HealthMin = Health.Min.Value,

View File

@ -10,12 +10,8 @@ namespace VPet.ModMaker.Models.ModModel;
public class ImageModel public class ImageModel
{ {
public ObservableValue<string> Id { get; } = new();
public ObservableValue<BitmapImage> Image { get; } = new(); public ObservableValue<BitmapImage> Image { get; } = new();
public ObservableValue<int> Duration { get; } = new(100); public ObservableValue<int> Duration { get; } = new(100);
public ImageModel(BitmapImage image)
{
Image.Value = image;
}
} }

View File

@ -12,6 +12,7 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using VPet.ModMaker.Models.ModModel;
using VPet_Simulator.Windows.Interface; using VPet_Simulator.Windows.Interface;
namespace VPet.ModMaker.Models; namespace VPet.ModMaker.Models;
@ -58,8 +59,6 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
GameVersion.Value = loader.GameVer.ToString(); GameVersion.Value = loader.GameVer.ToString();
ModVersion.Value = loader.Ver.ToString(); ModVersion.Value = loader.Ver.ToString();
var imagePath = Path.Combine(loader.ModPath.FullName, "icon.png"); var imagePath = Path.Combine(loader.ModPath.FullName, "icon.png");
Thread.Sleep(1000);
GC.Collect();
if (File.Exists(imagePath)) if (File.Exists(imagePath))
Image.Value = Utils.LoadImageToStream(imagePath); Image.Value = Utils.LoadImageToStream(imagePath);
foreach (var food in loader.Foods) foreach (var food in loader.Foods)
@ -71,7 +70,22 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
foreach (var selectText in loader.SelectTexts) foreach (var selectText in loader.SelectTexts)
SelectTexts.Add(new(selectText)); SelectTexts.Add(new(selectText));
foreach (var pet in loader.Pets) foreach (var pet in loader.Pets)
Pets.Add(new(pet)); {
var petModel = new PetModel(pet);
Pets.Add(petModel);
// TODO: 动画加载
//foreach (var p in pet.path)
//{
// foreach (var dir in Directory.EnumerateDirectories(p))
// {
// var animeModel = AnimeModel.Load(dir);
// if (animeModel != null)
// {
// petModel.Animes.TryAdd(animeModel.GraphType.Value, animeModel);
// }
// }
//}
}
foreach (var lang in loader.I18nDatas) foreach (var lang in loader.I18nDatas)
I18nDatas.Add(lang.Key, lang.Value); I18nDatas.Add(lang.Key, lang.Value);
@ -214,6 +228,21 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
GetWorksInfo(lps, pet); GetWorksInfo(lps, pet);
GetMoveInfo(lps, pet); GetMoveInfo(lps, pet);
File.WriteAllText(petFile, lps.ToString()); File.WriteAllText(petFile, lps.ToString());
foreach (var cultureName in I18nHelper.Current.CultureNames)
{
_saveI18nDatas[cultureName].TryAdd(
pet.Id.Value,
pet.I18nDatas[cultureName].Name.Value
);
_saveI18nDatas[cultureName].TryAdd(
pet.PetNameId.Value,
pet.I18nDatas[cultureName].PetName.Value
);
_saveI18nDatas[cultureName].TryAdd(
pet.DescriptionId.Value,
pet.I18nDatas[cultureName].Description.Value
);
}
} }
} }
@ -458,6 +487,15 @@ public class ModInfoModel : I18nModel<I18nModInfoModel>
} }
} }
} }
public void Close()
{
Image.Value.CloseStream();
foreach (var food in Foods)
food.Close();
//foreach (var pet in Pets)
// pet.Close();
}
} }
public class I18nModInfoModel public class I18nModInfoModel

View File

@ -36,12 +36,12 @@ public class MoveModel
public ObservableValue<int> TriggerTop { get; } = new(100); public ObservableValue<int> TriggerTop { get; } = new(100);
public ObservableValue<int> TriggerBottom { get; } = new(100); public ObservableValue<int> TriggerBottom { get; } = new(100);
public EnumFlagsVM<GraphHelper.Move.DirectionType> LocateType { get; } = public ObservableEnumFlagsVM<GraphHelper.Move.DirectionType> LocateType { get; } =
new(GraphHelper.Move.DirectionType.None); new(GraphHelper.Move.DirectionType.None);
public EnumFlagsVM<GraphHelper.Move.DirectionType> TriggerType { get; } = public ObservableEnumFlagsVM<GraphHelper.Move.DirectionType> TriggerType { get; } =
new(GraphHelper.Move.DirectionType.None); new(GraphHelper.Move.DirectionType.None);
public EnumFlagsVM<GraphHelper.Move.ModeType> ModeType { get; } = public ObservableEnumFlagsVM<GraphHelper.Move.ModeType> ModeType { get; } =
new(GraphHelper.Move.ModeType.Nomal); new(GraphHelper.Move.ModeType.Nomal);
public MoveModel() { } public MoveModel() { }

View File

@ -26,8 +26,7 @@ public class PetModel : I18nModel<I18nPetInfoModel>
public ObservableCollection<MoveModel> Moves { get; } = new(); public ObservableCollection<MoveModel> Moves { get; } = new();
public ObservableValue<AnimeModel> CurrentAnime { get; } = new(); public ObservableValue<AnimeModel> CurrentAnime { get; } = new();
public Dictionary<GraphInfo.GraphType, ObservableCollection<AnimeModel>> Animes { get; } = public Dictionary<GraphInfo.GraphType, AnimeModel> Animes { get; } = new();
new();
public PetModel() public PetModel()
{ {
@ -117,20 +116,6 @@ public class PetModel : I18nModel<I18nPetInfoModel>
Moves.Add(new(move)); Moves.Add(new(move));
} }
public void LoadAnime(GraphCore core)
{
foreach (var info in core.GraphsName)
{
var list = new ObservableCollection<AnimeModel>();
foreach (var name in info.Value)
{
foreach (var graph in core.GraphsList[name])
list.Add(new AnimeModel(name, graph.Key, graph.Value));
}
Animes.Add(info.Key, list);
}
}
public void Close() { } public void Close() { }
} }

View File

@ -28,7 +28,7 @@ public class SelectTextModel : I18nModel<I18nSelectTextModel>
public ObservableValue<string> Id { get; } = new(); public ObservableValue<string> Id { get; } = new();
public ObservableValue<string> ChooseId { get; } = new(); public ObservableValue<string> ChooseId { get; } = new();
public ObservableValue<ClickText.ModeType> Mode { get; } = new(); public ObservableEnumFlagsVM<ClickText.ModeType> Mode { get; } = new();
//public ObservableValue<string> Working { get; } = new(); //public ObservableValue<string> Working { get; } = new();
//public ObservableValue<VPet_Simulator.Core.Main.WorkingState> WorkingState { get; } = new(); //public ObservableValue<VPet_Simulator.Core.Main.WorkingState> WorkingState { get; } = new();
@ -56,7 +56,7 @@ public class SelectTextModel : I18nModel<I18nSelectTextModel>
: this() : this()
{ {
Id.Value = model.Id.Value; Id.Value = model.Id.Value;
Mode.Value = model.Mode.Value; Mode.EnumValue.Value = model.Mode.EnumValue.Value;
Tags.Value = model.Tags.Value; Tags.Value = model.Tags.Value;
ToTags.Value = model.ToTags.Value; ToTags.Value = model.ToTags.Value;
//Working.EnumValue = model.Working.EnumValue; //Working.EnumValue = model.Working.EnumValue;
@ -81,7 +81,7 @@ public class SelectTextModel : I18nModel<I18nSelectTextModel>
{ {
Id.Value = text.Text; Id.Value = text.Text;
ChooseId.Value = text.Choose ?? string.Empty; ChooseId.Value = text.Choose ?? string.Empty;
Mode.Value = text.Mode; Mode.EnumValue.Value = text.Mode;
Tags.Value = text.Tags is null ? string.Empty : string.Join(", ", text.Tags); Tags.Value = text.Tags is null ? string.Empty : string.Join(", ", text.Tags);
ToTags.Value = text.ToTags is null ? string.Empty : string.Join(", ", text.ToTags); ToTags.Value = text.ToTags is null ? string.Empty : string.Join(", ", text.ToTags);
//Working.EnumValue = text.Working; //Working.EnumValue = text.Working;
@ -105,7 +105,7 @@ public class SelectTextModel : I18nModel<I18nSelectTextModel>
{ {
Text = Id.Value, Text = Id.Value,
Choose = ChooseId.Value, Choose = ChooseId.Value,
Mode = Mode.Value, Mode = Mode.EnumValue.Value,
Tags = new(Tags.Value.Split(rs_splitChar, StringSplitOptions.RemoveEmptyEntries)), Tags = new(Tags.Value.Split(rs_splitChar, StringSplitOptions.RemoveEmptyEntries)),
ToTags = new(ToTags.Value.Split(rs_splitChar, StringSplitOptions.RemoveEmptyEntries)), ToTags = new(ToTags.Value.Split(rs_splitChar, StringSplitOptions.RemoveEmptyEntries)),
//Working = Working.EnumValue, //Working = Working.EnumValue,

View File

@ -31,6 +31,7 @@ public class WorkModel : I18nModel<I18nWorkModel>
public ObservableValue<int> LevelLimit { get; } = new(); public ObservableValue<int> LevelLimit { get; } = new();
public ObservableValue<int> Time { get; } = new(); public ObservableValue<int> Time { get; } = new();
public ObservableValue<double> FinishBonus { get; } = new(); public ObservableValue<double> FinishBonus { get; } = new();
public ObservableValue<bool> IsOverLoad { get; } = new();
public ObservableValue<SolidColorBrush> BorderBrush { get; } = public ObservableValue<SolidColorBrush> BorderBrush { get; } =
new(new((Color)ColorConverter.ConvertFromString("#FF0290D5"))); new(new((Color)ColorConverter.ConvertFromString("#FF0290D5")));
@ -47,7 +48,23 @@ public class WorkModel : I18nModel<I18nWorkModel>
public ObservableValue<double> Top { get; } = new(160); public ObservableValue<double> Top { get; } = new(160);
public ObservableValue<double> Width { get; } = new(300); public ObservableValue<double> Width { get; } = new(300);
public WorkModel() { } public WorkModel()
{
IsOverLoad.AddNotifyReceiver(
WorkType,
MoneyBase,
MoneyLevel,
StrengthFood,
StrengthDrink,
Feeling,
LevelLimit,
FinishBonus
);
IsOverLoad.NotifyReceived += (ref bool v) =>
{
v = VPet_Simulator.Windows.Interface.ExtensionFunction.IsOverLoad(ToWork());
};
}
public WorkModel(WorkModel model) public WorkModel(WorkModel model)
: this() : this()

View File

@ -12,7 +12,7 @@ namespace HKW.HKWViewModels.SimpleObservable;
/// 可观察值 /// 可观察值
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
[DebuggerDisplay("{EnumValue}")] [DebuggerDisplay("{Value}")]
public class ObservableValue<T> : INotifyPropertyChanging, INotifyPropertyChanged public class ObservableValue<T> : INotifyPropertyChanging, INotifyPropertyChanged
{ {
[DebuggerBrowsable(DebuggerBrowsableState.Never)] [DebuggerBrowsable(DebuggerBrowsableState.Never)]

View File

@ -43,4 +43,16 @@
</Grid> </Grid>
</Grid> </Grid>
</ControlTemplate> </ControlTemplate>
<ControlTemplate x:Key="ListBox_ShowLangs" TargetType="ListBox">
<ListBox
ItemsSource="{Binding I18nData.CultureNames}"
ScrollViewer.VerticalScrollBarVisibility="Auto"
SelectedItem="{Binding I18nData.CultureName.Value}">
<ListBox.ItemContainerStyle>
<Style BasedOn="{StaticResource {x:Type ListBoxItem}}" TargetType="ListBoxItem">
<Setter Property="Content" Value="{Binding}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</ControlTemplate>
</ResourceDictionary> </ResourceDictionary>

View File

@ -14,6 +14,8 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Deterministic>true</Deterministic> <Deterministic>true</Deterministic>
<IsWebBootstrapper>false</IsWebBootstrapper>
<Nullable>enable</Nullable>
<PublishUrl>publish\</PublishUrl> <PublishUrl>publish\</PublishUrl>
<Install>true</Install> <Install>true</Install>
<InstallFrom>Disk</InstallFrom> <InstallFrom>Disk</InstallFrom>
@ -26,10 +28,8 @@
<MapFileExtensions>true</MapFileExtensions> <MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision> <ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion> <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled> <BootstrapperEnabled>true</BootstrapperEnabled>
<Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@ -117,6 +117,7 @@
<Compile Include="SimpleObservable\ObservableCommandT.cs" /> <Compile Include="SimpleObservable\ObservableCommandT.cs" />
<Compile Include="Styles.cs" /> <Compile Include="Styles.cs" />
<Compile Include="ViewModels\ModEdit\AnimeEdit\AnimeEditWindowVM.cs" /> <Compile Include="ViewModels\ModEdit\AnimeEdit\AnimeEditWindowVM.cs" />
<Compile Include="ViewModels\ModEdit\AnimeEdit\AnimePageVM.cs" />
<Compile Include="ViewModels\ModEdit\ClickTextEdit\ClickTextEditWindowVM.cs" /> <Compile Include="ViewModels\ModEdit\ClickTextEdit\ClickTextEditWindowVM.cs" />
<Compile Include="ViewModels\ModEdit\ClickTextEdit\ClickTextPageVM.cs" /> <Compile Include="ViewModels\ModEdit\ClickTextEdit\ClickTextPageVM.cs" />
<Compile Include="ViewModels\ModEdit\FoodEdit\FoodPageVM.cs" /> <Compile Include="ViewModels\ModEdit\FoodEdit\FoodPageVM.cs" />

View File

@ -0,0 +1,109 @@
using HKW.HKWViewModels.SimpleObservable;
using LinePutScript.Localization.WPF;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using VPet.ModMaker.Models;
using VPet.ModMaker.Models.ModModel;
using VPet.ModMaker.Views.ModEdit.AnimeEdit;
namespace VPet.ModMaker.ViewModels.ModEdit.AnimeEdit;
public class AnimePageVM
{
//#region Value
//public ObservableValue<ObservableCollection<AnimeModel>> ShowAnimes { get; } = new();
//public ObservableCollection<AnimeModel> Works => CurrentPet.Value.Works;
//public ObservableCollection<PetModel> Pets => ModInfoModel.Current.Pets;
//public ObservableValue<PetModel> CurrentPet { get; } = new(new());
//public ObservableValue<string> Filter { get; } = new();
//#endregion
//#region Command
//public ObservableCommand AddCommand { get; } = new();
//public ObservableCommand<AnimeModel> EditCommand { get; } = new();
//public ObservableCommand<AnimeModel> RemoveCommand { get; } = new();
//#endregion
//public AnimePageVM()
//{
// ShowAnimes.Value = Works;
// CurrentPet.ValueChanged += CurrentPet_ValueChanged;
// Filter.ValueChanged += Filter_ValueChanged;
// AddCommand.ExecuteEvent += Add;
// EditCommand.ExecuteEvent += Edit;
// RemoveCommand.ExecuteEvent += Remove;
//}
//private void CurrentPet_ValueChanged(PetModel oldValue, PetModel newValue)
//{
// //ShowAnimes.Value = newValue.Animes;
//}
//private void Filter_ValueChanged(string oldValue, string newValue)
//{
// if (string.IsNullOrWhiteSpace(newValue))
// {
// ShowAnimes.Value = Works;
// }
// else
// {
// ShowAnimes.Value = new(
// Works.Where(m => m.Id.Value.Contains(newValue, StringComparison.OrdinalIgnoreCase))
// );
// }
//}
//public void Close() { }
//private void Add()
//{
// var window = new AnimeEditWindow();
// var vm = window.ViewModel;
// vm.CurrentPet = CurrentPet.Value;
// window.ShowDialog();
// if (window.IsCancel)
// return;
// Works.Add(vm.Work.Value);
//}
//public void Edit(AnimeModel model)
//{
// var window = new AnimeEditWindow();
// var vm = window.ViewModel;
// vm.CurrentPet = CurrentPet.Value;
// vm.OldWork = model;
// var newWork = vm.Work.Value = new(model);
// window.ShowDialog();
// if (window.IsCancel)
// return;
// if (ShowAnimes.Value.Count == Works.Count)
// {
// Works[Works.IndexOf(model)] = newWork;
// }
// else
// {
// Works[Works.IndexOf(model)] = newWork;
// ShowAnimes.Value[ShowAnimes.Value.IndexOf(model)] = newWork;
// }
//}
//private void Remove(AnimeModel food)
//{
// if (MessageBox.Show("确定删除吗".Translate(), "", MessageBoxButton.YesNo) is MessageBoxResult.No)
// return;
// if (ShowAnimes.Value.Count == Works.Count)
// {
// Works.Remove(food);
// }
// else
// {
// ShowAnimes.Value.Remove(food);
// Works.Remove(food);
// }
//}
}

View File

@ -12,6 +12,8 @@ namespace VPet.ModMaker.ViewModels.ModEdit.ClickTextEdit;
public class ClickTextEditWindowVM public class ClickTextEditWindowVM
{ {
public I18nHelper I18nData => I18nHelper.Current;
#region Value #region Value
public ClickTextModel OldClickText { get; set; } public ClickTextModel OldClickText { get; set; }

View File

@ -16,6 +16,7 @@ namespace VPet.ModMaker.ViewModels.ModEdit.FoodEdit;
public class FoodEditWindowVM public class FoodEditWindowVM
{ {
public I18nHelper I18nData => I18nHelper.Current;
#region Value #region Value
public FoodModel OldFood { get; set; } public FoodModel OldFood { get; set; }
public ObservableValue<FoodModel> Food { get; } = new(new()); public ObservableValue<FoodModel> Food { get; } = new(new());

View File

@ -12,6 +12,7 @@ namespace VPet.ModMaker.ViewModels.ModEdit.LowTextEdit;
public class LowTextEditWindowVM public class LowTextEditWindowVM
{ {
public I18nHelper I18nData => I18nHelper.Current;
#region Value #region Value
public LowTextModel OldLowText { get; set; } public LowTextModel OldLowText { get; set; }
public ObservableValue<LowTextModel> LowText { get; } = new(new()); public ObservableValue<LowTextModel> LowText { get; } = new(new());

View File

@ -103,6 +103,8 @@ public class ModEditWindowVM
if (window.IsCancel) if (window.IsCancel)
return; return;
I18nHelper.Current.CultureNames.Add(window.Lang.Value); I18nHelper.Current.CultureNames.Add(window.Lang.Value);
if (I18nHelper.Current.CultureNames.Count == 1)
I18nHelper.Current.CultureName.Value = window.Lang.Value;
} }
private void EditLang(string oldLang) private void EditLang(string oldLang)
@ -149,6 +151,8 @@ public class ModEditWindowVM
private void SaveTo() private void SaveTo()
{ {
if (ValidationData(ModInfo.Value) is false)
return;
SaveFileDialog saveFileDialog = SaveFileDialog saveFileDialog =
new() new()
{ {
@ -173,4 +177,29 @@ public class ModEditWindowVM
MessageBox.Show("保存成功".Translate()); MessageBox.Show("保存成功".Translate());
} }
} }
private bool ValidationData(ModInfoModel model)
{
if (I18nHelper.Current.CultureNames.Count == 0)
{
MessageBox.Show(
"未添加任何语言".Translate(),
"",
MessageBoxButton.OK,
MessageBoxImage.Warning
);
return false;
}
if (string.IsNullOrWhiteSpace(model.Id.Value))
{
MessageBox.Show("Id不可为空".Translate(), "", MessageBoxButton.OK, MessageBoxImage.Warning);
return false;
}
if (string.IsNullOrWhiteSpace(model.Author.Value))
{
MessageBox.Show("作者不可为空".Translate(), "", MessageBoxButton.OK, MessageBoxImage.Warning);
return false;
}
return true;
}
} }

View File

@ -14,6 +14,7 @@ namespace VPet.ModMaker.ViewModels.ModEdit.PetEdit;
public class PetEditWindowVM public class PetEditWindowVM
{ {
public I18nHelper I18nData => I18nHelper.Current;
public PetModel OldPet { get; set; } public PetModel OldPet { get; set; }
public ObservableValue<PetModel> Pet { get; } = new(new()); public ObservableValue<PetModel> Pet { get; } = new(new());
@ -38,7 +39,7 @@ public class PetEditWindowVM
public void Close() public void Close()
{ {
Image.Value?.StreamSource?.Close(); Image.Value?.CloseStream();
} }
private void AddImage() private void AddImage()

View File

@ -10,6 +10,7 @@ namespace VPet.ModMaker.ViewModels.ModEdit.SelectTextEdit;
public class SelectTextEditWindowVM public class SelectTextEditWindowVM
{ {
public I18nHelper I18nData => I18nHelper.Current;
#region Value #region Value
public SelectTextModel OldSelectText { get; set; } public SelectTextModel OldSelectText { get; set; }
public ObservableValue<SelectTextModel> SelectText { get; } = new(new()); public ObservableValue<SelectTextModel> SelectText { get; } = new(new());

View File

@ -13,6 +13,7 @@ namespace VPet.ModMaker.ViewModels.ModEdit.WorkEdit;
public class WorkEditWindowVM public class WorkEditWindowVM
{ {
public I18nHelper I18nData => I18nHelper.Current;
#region Value #region Value
public PetModel CurrentPet { get; set; } public PetModel CurrentPet { get; set; }
public WorkModel OldWork { get; set; } public WorkModel OldWork { get; set; }
@ -39,7 +40,7 @@ public class WorkEditWindowVM
public void Close() public void Close()
{ {
Image.Value?.StreamSource?.Close(); Image.Value?.CloseStream();
} }
private void AddImage() private void AddImage()

View File

@ -81,8 +81,12 @@ public class ModMakerWindowVM
private void AddHistories(ModInfoModel modInfo) private void AddHistories(ModInfoModel modInfo)
{ {
if (Histories.FirstOrDefault(h => h.Id == modInfo.Id.Value) is ModMakerHistory history) if (
Histories.FirstOrDefault(h => h.SourcePath == modInfo.SourcePath.Value)
is ModMakerHistory history
)
{ {
history.Id = modInfo.Id.Value;
history.SourcePath = modInfo.SourcePath.Value; history.SourcePath = modInfo.SourcePath.Value;
history.LastTime = DateTime.Now; history.LastTime = DateTime.Now;
} }
@ -121,6 +125,9 @@ public class ModMakerWindowVM
private void ShowEditWindow() private void ShowEditWindow()
{ {
if (string.IsNullOrEmpty(ModInfoModel.Current.SourcePath.Value) is false)
AddHistories(ModInfoModel.Current);
SaveHistories();
ModEditWindow = new(); ModEditWindow = new();
ModEditWindow.Show(); ModEditWindow.Show();
ModMakerWindow.Hide(); ModMakerWindow.Hide();
@ -130,7 +137,10 @@ public class ModMakerWindowVM
if (string.IsNullOrEmpty(modInfo.SourcePath.Value) is false) if (string.IsNullOrEmpty(modInfo.SourcePath.Value) is false)
AddHistories(modInfo); AddHistories(modInfo);
SaveHistories(); SaveHistories();
ModMakerWindow.Close(); ModInfoModel.Current.Close();
ModInfoModel.Current = null;
I18nHelper.Current = new();
ModMakerWindow.Show();
}; };
} }
@ -138,6 +148,7 @@ public class ModMakerWindowVM
{ {
ShowHistories.Value.Clear(); ShowHistories.Value.Clear();
Histories.Clear(); Histories.Clear();
File.WriteAllText(ModMakerInfo.HistoryFile, string.Empty);
} }
public void LoadModFromFile() public void LoadModFromFile()

View File

@ -11,7 +11,7 @@
Title="Window_AddLang" Title="Window_AddLang"
Width="400" Width="400"
Height="300" Height="300"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<local:Window_AddLang /> <local:Window_AddLang />

View File

@ -24,6 +24,14 @@ public partial class AnimeEditWindow : Window
{ {
InitializeComponent(); InitializeComponent();
DataContext = new AnimeEditWindowVM(); DataContext = new AnimeEditWindowVM();
Closed += (s, e) =>
{
try
{
DataContext = null;
}
catch { }
};
} }
public AnimeEditWindowVM ViewModel => (AnimeEditWindowVM)DataContext; public AnimeEditWindowVM ViewModel => (AnimeEditWindowVM)DataContext;

View File

@ -11,14 +11,16 @@
Title="ClickTextWindow" Title="ClickTextWindow"
Width="800" Width="800"
Height="450" Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:ClickTextEditWindowVM /> <vm:ClickTextEditWindowVM />
</d:Window.DataContext> </d:Window.DataContext>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition /> <ColumnDefinition MinWidth="300" />
<ColumnDefinition Width="200" /> <ColumnDefinition Width="Auto" MinWidth="300" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -71,11 +73,30 @@
pu:TextBoxHelper.Watermark="{ll:Str 非必要}" pu:TextBoxHelper.Watermark="{ll:Str 非必要}"
Text="{Binding ClickText.Value.Working.Value, UpdateSourceTrigger=PropertyChanged}" /> Text="{Binding ClickText.Value.Working.Value, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Row="3" Content="{ll:Str 模式}" /> <Label Grid.Row="3" Content="{ll:Str 模式}" />
<ComboBox <Grid Grid.Row="3" Grid.Column="1">
Grid.Row="3" <Grid.ColumnDefinitions>
Grid.Column="1" <ColumnDefinition />
ItemsSource="{Binding ClickText.Value.ModeTypes}" <ColumnDefinition Width="Auto" />
SelectedItem="{Binding ClickText.Value.Mode.Value}" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding ClickText.Value.Mode.EnumValue.Value}" />
<ComboBox
x:Name="ComboBox_Mode"
Grid.Column="1"
ItemsSource="{Binding ClickText.Value.ModeTypes}"
SelectedIndex="0" />
<Button
Grid.Column="2"
Command="{Binding ClickText.Value.Mode.AddCommand}"
CommandParameter="{Binding SelectedItem, ElementName=ComboBox_Mode}"
Content="+" />
<Button
Grid.Column="3"
Command="{Binding ClickText.Value.Mode.RemoveCommand}"
CommandParameter="{Binding SelectedItem, ElementName=ComboBox_Mode}"
Content="-" />
</Grid>
<Label Grid.Row="4" Content="{ll:Str 工作状态}" /> <Label Grid.Row="4" Content="{ll:Str 工作状态}" />
<ComboBox <ComboBox
Grid.Row="4" Grid.Row="4"
@ -83,11 +104,30 @@
ItemsSource="{Binding ClickText.Value.WorkingStates}" ItemsSource="{Binding ClickText.Value.WorkingStates}"
SelectedItem="{Binding ClickText.Value.WorkingState.Value}" /> SelectedItem="{Binding ClickText.Value.WorkingState.Value}" />
<Label Grid.Row="5" Content="{ll:Str 日期区间}" /> <Label Grid.Row="5" Content="{ll:Str 日期区间}" />
<ComboBox <Grid Grid.Row="5" Grid.Column="1">
Grid.Row="5" <Grid.ColumnDefinitions>
Grid.Column="1" <ColumnDefinition />
ItemsSource="{Binding ClickText.Value.DayTimes}" <ColumnDefinition Width="Auto" />
SelectedItem="{Binding ClickText.Value.DayTime.Value}" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding ClickText.Value.DayTime.EnumValue.Value}" />
<ComboBox
x:Name="ComboBox_DayTime"
Grid.Column="1"
ItemsSource="{Binding ClickText.Value.DayTimes}"
SelectedIndex="0" />
<Button
Grid.Column="2"
Command="{Binding ClickText.Value.DayTime.AddCommand}"
CommandParameter="{Binding SelectedItem, ElementName=ComboBox_DayTime}"
Content="+" />
<Button
Grid.Column="3"
Command="{Binding ClickText.Value.DayTime.RemoveCommand}"
CommandParameter="{Binding SelectedItem, ElementName=ComboBox_DayTime}"
Content="-" />
</Grid>
<ListBox Grid.Row="6" Grid.ColumnSpan="2"> <ListBox Grid.Row="6" Grid.ColumnSpan="2">
<ListBoxItem <ListBoxItem
DataContext="{Binding ClickText.Value.Like}" DataContext="{Binding ClickText.Value.Like}"
@ -141,5 +181,6 @@
Content="{ll:Str 确定}" /> Content="{ll:Str 确定}" />
</Grid> </Grid>
</Grid> </Grid>
<ListBox Grid.Column="2" Template="{StaticResource ListBox_ShowLangs}" />
</Grid> </Grid>
</Window> </Window>

View File

@ -29,6 +29,14 @@ public partial class ClickTextEditWindow : Window
{ {
InitializeComponent(); InitializeComponent();
DataContext = new ClickTextEditWindowVM(); DataContext = new ClickTextEditWindowVM();
Closed += (s, e) =>
{
try
{
DataContext = null;
}
catch { }
};
} }
private void Button_Cancel_Click(object sender, RoutedEventArgs e) private void Button_Cancel_Click(object sender, RoutedEventArgs e)

View File

@ -65,10 +65,10 @@
</DataGridTextColumn.Header> </DataGridTextColumn.Header>
</DataGridTextColumn> </DataGridTextColumn>
<DataGridTextColumn <DataGridTextColumn
Binding="{Binding Mode.Value}" Binding="{Binding Mode.EnumValue.Value}"
CanUserSort="True" CanUserSort="True"
IsReadOnly="True" IsReadOnly="True"
SortMemberPath="Mode.Value"> SortMemberPath="Mode.EnumValue.Value">
<DataGridTextColumn.Header> <DataGridTextColumn.Header>
<TextBlock Text="{ll:Str 状态}" /> <TextBlock Text="{ll:Str 状态}" />
</DataGridTextColumn.Header> </DataGridTextColumn.Header>
@ -92,10 +92,10 @@
</DataGridTextColumn.Header> </DataGridTextColumn.Header>
</DataGridTextColumn> </DataGridTextColumn>
<DataGridTextColumn <DataGridTextColumn
Binding="{Binding DayTime.Value}" Binding="{Binding DayTime.EnumValue.Value}"
CanUserSort="True" CanUserSort="True"
IsReadOnly="True" IsReadOnly="True"
SortMemberPath="DayTime.Value"> SortMemberPath="DayTime.EnumValue.Value">
<DataGridTextColumn.Header> <DataGridTextColumn.Header>
<TextBlock Text="{ll:Str 时间}" /> <TextBlock Text="{ll:Str 时间}" />
</DataGridTextColumn.Header> </DataGridTextColumn.Header>

View File

@ -11,14 +11,16 @@
Title="Window_FoodEdit" Title="Window_FoodEdit"
Width="800" Width="800"
Height="450" Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:FoodEditWindowVM /> <vm:FoodEditWindowVM />
</d:Window.DataContext> </d:Window.DataContext>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="250" />
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -28,8 +30,8 @@
<Grid> <Grid>
<Image <Image
x:Name="Image_FoodImage" x:Name="Image_FoodImage"
Width="256" Width="250"
Height="256" Height="250"
Source="{Binding Food.Value.Image.Value}" Source="{Binding Food.Value.Image.Value}"
Stretch="Uniform"> Stretch="Uniform">
<Image.ContextMenu> <Image.ContextMenu>
@ -187,5 +189,6 @@
Content="{ll:Str 确定}" /> Content="{ll:Str 确定}" />
</Grid> </Grid>
</Grid> </Grid>
<ListBox Grid.Column="2" Template="{StaticResource ListBox_ShowLangs}" />
</Grid> </Grid>
</Window> </Window>

View File

@ -36,6 +36,11 @@ public partial class FoodEditWindow : Window
{ {
if (IsCancel) if (IsCancel)
ViewModel.Close(); ViewModel.Close();
try
{
DataContext = null;
}
catch { }
}; };
} }
@ -56,11 +61,6 @@ public partial class FoodEditWindow : Window
MessageBox.Show("图像不可为空".Translate(), "", MessageBoxButton.OK, MessageBoxImage.Warning); MessageBox.Show("图像不可为空".Translate(), "", MessageBoxButton.OK, MessageBoxImage.Warning);
return; return;
} }
if (string.IsNullOrWhiteSpace(ViewModel.Food.Value.CurrentI18nData.Value.Name.Value))
{
MessageBox.Show("名称不可为空".Translate(), "", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if ( if (
ViewModel.OldFood?.Id.Value != ViewModel.Food.Value.Id.Value ViewModel.OldFood?.Id.Value != ViewModel.Food.Value.Id.Value
&& ModInfoModel.Current.Foods.Any(i => i.Id == ViewModel.Food.Value.Id) && ModInfoModel.Current.Foods.Any(i => i.Id == ViewModel.Food.Value.Id)

View File

@ -11,6 +11,7 @@
Title="Page_LowText" Title="Page_LowText"
Width="800" Width="800"
Height="450" Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:LowTextEditWindowVM /> <vm:LowTextEditWindowVM />
@ -18,7 +19,8 @@
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="300" /> <ColumnDefinition MinWidth="300" />
<ColumnDefinition Width="200" /> <ColumnDefinition Width="Auto" MinWidth="200" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -95,5 +97,6 @@
Content="{ll:Str 确定}" /> Content="{ll:Str 确定}" />
</Grid> </Grid>
</Grid> </Grid>
<ListBox Grid.Column="2" Template="{StaticResource ListBox_ShowLangs}" />
</Grid> </Grid>
</Window> </Window>

View File

@ -30,6 +30,14 @@ public partial class LowTextEditWindow : Window
{ {
InitializeComponent(); InitializeComponent();
DataContext = new LowTextEditWindowVM(); DataContext = new LowTextEditWindowVM();
Closed += (s, e) =>
{
try
{
DataContext = null;
}
catch { }
};
} }
private void Button_Cancel_Click(object sender, RoutedEventArgs e) private void Button_Cancel_Click(object sender, RoutedEventArgs e)

View File

@ -11,7 +11,7 @@
Title="ModEditWindow" Title="ModEditWindow"
Width="1000" Width="1000"
Height="500" Height="500"
WindowStartupLocation="CenterOwner" WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:ModEditWindowVM /> <vm:ModEditWindowVM />

View File

@ -53,5 +53,17 @@ public partial class ModEditWindow : Window
private void Window_ModEdit_Closed(object sender, EventArgs e) private void Window_ModEdit_Closed(object sender, EventArgs e)
{ {
ViewModel.Close(); ViewModel.Close();
try
{
DataContext = null;
FoodPage.DataContext = null;
LowTextPage.DataContext = null;
ClickTextPage.DataContext = null;
SelectTextPage.DataContext = null;
PetPage.DataContext = null;
WorkPage.DataContext = null;
MovePage.DataContext = null;
}
catch { }
} }
} }

View File

@ -11,6 +11,7 @@
Title="MoveEditWindow" Title="MoveEditWindow"
Width="800" Width="800"
Height="450" Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:MoveEditWindowVM /> <vm:MoveEditWindowVM />

View File

@ -31,6 +31,11 @@ public partial class MoveEditWindow : Window
Closed += (s, e) => Closed += (s, e) =>
{ {
ViewModel.Close(); ViewModel.Close();
try
{
DataContext = null;
}
catch { }
}; };
} }

View File

@ -11,6 +11,7 @@
Title="PetEditWindow" Title="PetEditWindow"
Width="800" Width="800"
Height="450" Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:PetEditWindowVM /> <vm:PetEditWindowVM />
@ -37,8 +38,9 @@
</Window.Resources> </Window.Resources>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="250" />
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -63,18 +65,16 @@
<Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label"> <Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label">
<Setter Property="Width"> <Setter Property="Width">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchHeadRect.Value.Width.Value" /> <Binding Path="Pet.Value.TouchHeadRect.Value.Width.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="Height"> <Setter Property="Height">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchHeadRect.Value.Height.Value" /> <Binding Path="Pet.Value.TouchHeadRect.Value.Height.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
@ -96,18 +96,16 @@
<Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label"> <Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label">
<Setter Property="Width"> <Setter Property="Width">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchRaisedRect.Value.Happy.Value.Width.Value" /> <Binding Path="Pet.Value.TouchRaisedRect.Value.Happy.Value.Width.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="Height"> <Setter Property="Height">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchRaisedRect.Value.Happy.Value.Height.Value" /> <Binding Path="Pet.Value.TouchRaisedRect.Value.Happy.Value.Height.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
@ -129,18 +127,16 @@
<Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label"> <Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label">
<Setter Property="Width"> <Setter Property="Width">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchRaisedRect.Value.Nomal.Value.Width.Value" /> <Binding Path="Pet.Value.TouchRaisedRect.Value.Nomal.Value.Width.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="Height"> <Setter Property="Height">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchRaisedRect.Value.Nomal.Value.Height.Value" /> <Binding Path="Pet.Value.TouchRaisedRect.Value.Nomal.Value.Height.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
@ -162,18 +158,16 @@
<Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label"> <Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label">
<Setter Property="Width"> <Setter Property="Width">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchRaisedRect.Value.PoorCondition.Value.Width.Value" /> <Binding Path="Pet.Value.TouchRaisedRect.Value.PoorCondition.Value.Width.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="Height"> <Setter Property="Height">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchRaisedRect.Value.PoorCondition.Value.Height.Value" /> <Binding Path="Pet.Value.TouchRaisedRect.Value.PoorCondition.Value.Height.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
@ -195,18 +189,16 @@
<Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label"> <Style BasedOn="{StaticResource Label_ThouchRect}" TargetType="Label">
<Setter Property="Width"> <Setter Property="Width">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchRaisedRect.Value.Ill.Value.Width.Value" /> <Binding Path="Pet.Value.TouchRaisedRect.Value.Ill.Value.Width.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="Height"> <Setter Property="Height">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Pet.Value.TouchRaisedRect.Value.Ill.Value.Height.Value" /> <Binding Path="Pet.Value.TouchRaisedRect.Value.Ill.Value.Height.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
@ -348,6 +340,7 @@
<TextBox <TextBox
Grid.Row="3" Grid.Row="3"
Grid.Column="1" Grid.Column="1"
Style="{StaticResource TextBox_Wrap}"
Text="{Binding Pet.Value.CurrentI18nData.Value.Description.Value}" /> Text="{Binding Pet.Value.CurrentI18nData.Value.Description.Value}" />
</Grid> </Grid>
</Grid> </Grid>
@ -805,5 +798,6 @@
Content="{ll:Str 确定}" /> Content="{ll:Str 确定}" />
</Grid> </Grid>
</Grid> </Grid>
<ListBox Grid.Column="2" Template="{StaticResource ListBox_ShowLangs}" />
</Grid> </Grid>
</Window> </Window>

View File

@ -32,6 +32,11 @@ public partial class PetEditWindow : Window
Closed += (s, e) => Closed += (s, e) =>
{ {
ViewModel.Close(); ViewModel.Close();
try
{
DataContext = null;
}
catch { }
}; };
} }

View File

@ -11,14 +11,16 @@
Title="SelectTextWindow" Title="SelectTextWindow"
Width="800" Width="800"
Height="450" Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:SelectTextEditWindowVM /> <vm:SelectTextEditWindowVM />
</d:Window.DataContext> </d:Window.DataContext>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition /> <ColumnDefinition MinWidth="300" />
<ColumnDefinition Width="200" /> <ColumnDefinition Width="Auto" MinWidth="300" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -78,11 +80,6 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition /> <RowDefinition />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<!--<Label Content="{ll:Str 指定工作}" />
<TextBox
Grid.Column="1"
pu:TextBoxHelper.Watermark="{ll:Str 非必要}"
Text="{Binding SelectText.Value.Working.Value, UpdateSourceTrigger=PropertyChanged}" />-->
<Label Grid.Row="2" Content="{ll:Str 标签}" /> <Label Grid.Row="2" Content="{ll:Str 标签}" />
<TextBox <TextBox
Grid.Row="2" Grid.Row="2"
@ -96,23 +93,30 @@
pu:TextBoxHelper.Watermark="{ll:Str 多标签使用逗号分隔}" pu:TextBoxHelper.Watermark="{ll:Str 多标签使用逗号分隔}"
Text="{Binding SelectText.Value.ToTags.Value, UpdateSourceTrigger=PropertyChanged}" /> Text="{Binding SelectText.Value.ToTags.Value, UpdateSourceTrigger=PropertyChanged}" />
<Label Grid.Row="4" Content="{ll:Str 模式}" /> <Label Grid.Row="4" Content="{ll:Str 模式}" />
<ComboBox <Grid Grid.Row="4" Grid.Column="1">
Grid.Row="4" <Grid.ColumnDefinitions>
Grid.Column="1" <ColumnDefinition />
ItemsSource="{Binding SelectText.Value.ModeTypes}" <ColumnDefinition Width="Auto" />
SelectedItem="{Binding SelectText.Value.Mode.Value}" /> <ColumnDefinition Width="Auto" />
<!--<Label Grid.Row="5" Content="{ll:Str 工作状态}" /> <ColumnDefinition Width="Auto" />
<ComboBox </Grid.ColumnDefinitions>
Grid.Row="5" <TextBlock Text="{Binding SelectText.Value.Mode.EnumValue.Value}" />
Grid.Column="1" <ComboBox
ItemsSource="{Binding SelectText.Value.WorkingStates}" x:Name="ComboBox_Mode"
SelectedItem="{Binding SelectText.Value.WorkingState.Value}" /> Grid.Column="1"
<Label Grid.Row="6" Content="{ll:Str 日期区间}" /> ItemsSource="{Binding SelectText.Value.ModeTypes}"
<ComboBox SelectedIndex="0" />
Grid.Row="6" <Button
Grid.Column="1" Grid.Column="2"
ItemsSource="{Binding SelectText.Value.DayTimes}" Command="{Binding SelectText.Value.Mode.AddCommand}"
SelectedItem="{Binding SelectText.Value.DayTime.Value}" />--> CommandParameter="{Binding SelectedItem, ElementName=ComboBox_Mode}"
Content="+" />
<Button
Grid.Column="3"
Command="{Binding SelectText.Value.Mode.RemoveCommand}"
CommandParameter="{Binding SelectedItem, ElementName=ComboBox_Mode}"
Content="-" />
</Grid>
<ListBox Grid.Row="7" Grid.ColumnSpan="2"> <ListBox Grid.Row="7" Grid.ColumnSpan="2">
<ListBoxItem <ListBoxItem
DataContext="{Binding SelectText.Value.Like}" DataContext="{Binding SelectText.Value.Like}"
@ -166,5 +170,6 @@
Content="{ll:Str 确定}" /> Content="{ll:Str 确定}" />
</Grid> </Grid>
</Grid> </Grid>
<ListBox Grid.Column="2" Template="{StaticResource ListBox_ShowLangs}" />
</Grid> </Grid>
</Window> </Window>

View File

@ -29,6 +29,14 @@ public partial class SelectTextEditWindow : Window
{ {
InitializeComponent(); InitializeComponent();
DataContext = new SelectTextEditWindowVM(); DataContext = new SelectTextEditWindowVM();
Closed += (s, e) =>
{
try
{
DataContext = null;
}
catch { }
};
} }
private void Button_Cancel_Click(object sender, RoutedEventArgs e) private void Button_Cancel_Click(object sender, RoutedEventArgs e)

View File

@ -11,6 +11,7 @@
Title="WorkEditWindow" Title="WorkEditWindow"
Width="800" Width="800"
Height="450" Height="450"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:WorkEditWindowVM /> <vm:WorkEditWindowVM />
@ -19,6 +20,7 @@
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -51,22 +53,18 @@
<Style BasedOn="{StaticResource {x:Type Label}}" TargetType="Label"> <Style BasedOn="{StaticResource {x:Type Label}}" TargetType="Label">
<Setter Property="Width"> <Setter Property="Width">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*">
<Binding Path="Work.Value.Width.Value" /> <Binding Path="Work.Value.Width.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="Height"> <Setter Property="Height">
<Setter.Value> <Setter.Value>
<MultiBinding Converter="{StaticResource CalculatorConverter}"> <MultiBinding Converter="{StaticResource CalculatorConverter}" ConverterParameter="*/*">
<Binding Path="Work.Value.Width.Value" /> <Binding Path="Work.Value.Width.Value" />
<Binding Source="*" />
<Binding Path="LengthRatio.Value" /> <Binding Path="LengthRatio.Value" />
<Binding Source="/" />
<Binding Source="300" /> <Binding Source="300" />
<Binding Source="*" />
<Binding Source="180" /> <Binding Source="180" />
</MultiBinding> </MultiBinding>
</Setter.Value> </Setter.Value>
@ -125,6 +123,7 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Label Content="Id" /> <Label Content="Id" />
<TextBox Grid.Column="1" Text="{Binding Work.Value.Id.Value}" /> <TextBox Grid.Column="1" Text="{Binding Work.Value.Id.Value}" />
@ -144,6 +143,11 @@
Grid.Row="3" Grid.Row="3"
Grid.Column="1" Grid.Column="1"
Text="{Binding Work.Value.Graph.Value}" /> Text="{Binding Work.Value.Graph.Value}" />
<Label Grid.Row="4" Content="{ll:Str 是否超模}" />
<TextBlock
Grid.Row="4"
Grid.Column="1"
Text="{Binding Work.Value.IsOverLoad.Value}" />
<!--<Label Grid.Row="3" Content="{ll:Str 宠物描述}" /> <!--<Label Grid.Row="3" Content="{ll:Str 宠物描述}" />
<TextBox <TextBox
Grid.Row="3" Grid.Row="3"
@ -298,5 +302,6 @@
Content="{ll:Str 确定}" /> Content="{ll:Str 确定}" />
</Grid> </Grid>
</Grid> </Grid>
<ListBox Grid.Column="2" Template="{StaticResource ListBox_ShowLangs}" />
</Grid> </Grid>
</Window> </Window>

View File

@ -32,6 +32,11 @@ public partial class WorkEditWindow : Window
Closed += (s, e) => Closed += (s, e) =>
{ {
ViewModel.Close(); ViewModel.Close();
try
{
DataContext = null;
}
catch { }
}; };
} }

View File

@ -118,6 +118,15 @@
<TextBlock Text="{ll:Str 动画名称}" /> <TextBlock Text="{ll:Str 动画名称}" />
</DataGridTextColumn.Header> </DataGridTextColumn.Header>
</DataGridTextColumn> </DataGridTextColumn>
<DataGridTextColumn
Binding="{Binding IsOverLoad.Value}"
CanUserSort="True"
IsReadOnly="True"
SortMemberPath="Graph.Value">
<DataGridTextColumn.Header>
<TextBlock Text="{ll:Str 是否超模}" />
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn <DataGridTextColumn
Binding="{Binding MoneyBase.Value}" Binding="{Binding MoneyBase.Value}"
CanUserSort="True" CanUserSort="True"

View File

@ -12,6 +12,7 @@
Width="600" Width="600"
Height="450" Height="450"
FontSize="16" FontSize="16"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<d:Window.DataContext> <d:Window.DataContext>
<vm:ModMakerWindowVM /> <vm:ModMakerWindowVM />